diff --git a/Code/ForceField/ANI/ANIForceField_catch.cpp b/Code/ForceField/ANI/ANIForceField_catch.cpp new file mode 100644 index 00000000000..c997b762c64 --- /dev/null +++ b/Code/ForceField/ANI/ANIForceField_catch.cpp @@ -0,0 +1,466 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include "RDGeneral/test.h" +#include "catch.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Eigen; +using namespace Catch::literals; + +TEST_CASE("ANI-1ccx NN Forward Pass", "[ANI Force Field]") { + std::string pathName = getenv("RDBASE"); + std::string dirPath = pathName + "/Code/GraphMol/Descriptors/test_data/"; + SECTION("CH4") { + std::string molFile = dirPath + "CH4.mol"; + + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + int confId = -1; + auto conf = mol->getConformer(confId); + auto numAtoms = mol->getNumAtoms(); + auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + ForceFields::ForceField field; + auto &ps = field.positions(); + double *pos; + pos = new double[numAtoms * 3]; + for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + auto atom = conf.getAtomPos(i); + ps.push_back(&atom); + pos[3 * i] = atom.x; + pos[3 * i + 1] = atom.y; + pos[3 * i + 2] = atom.z; + + auto ac = new ForceFields::ANI::ANIAtomContrib( + &field, speciesVec(i), i, speciesVec, numAtoms, 4, 8, "ANI-1ccx"); + field.contribs().push_back(ForceFields::ContribPtr(ac)); + } + field.initialize(); + CHECK(field.calcEnergy(pos) == (-40.0553_a).margin(0.05)); + double *grad; + grad = new double[numAtoms * 3]; + + for (int i = 0; i < 50; i++) { + field.calcGrad(pos, grad); + for (int j = 0; j < numAtoms; j++) { + std::cout << grad[3 * j] << " " << grad[3 * j + 1] << " " << grad[3 * j + 2] << std::endl; + double *acc; + acc = new double[3]; + for (int k = 0; k < 3; k++) { + if (speciesVec(i) == 0) { + acc[k] = grad[3 * j + k]; + } + else if (speciesVec(i) == 1) { + acc[k] = grad[3 * j + k] / 12; + } + else if (speciesVec(i) == 2) { + acc[k] = grad[3 * j + k] / 14; + } + else if (speciesVec(i) == 3) { + acc[k] = grad[3 * j + k] / 16; + } + } + + pos[3 * j] -= acc[0]; + pos[3 * j + 1] -= acc[1]; + pos[3 * j + 2] -= acc[2]; + } + std::cout << field.calcEnergy(pos) << std::endl; + std::cout << "--------------" << std::endl; + + } + // field.calcGrad(pos, grad); + // for (int i = 0; i < numAtoms; i++) { + // std::cout << grad[3 * i] << " " << grad[3 * i + 1] << " " << grad[3 * i + 2] << std::endl; + // } + } + // SECTION("NH3") { + // std::string molFile = dirPath + "NH3.mol"; + + // RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + // int confId = -1; + // auto conf = mol->getConformer(confId); + // auto numAtoms = mol->getNumAtoms(); + // auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + // ForceFields::ForceField field; + // auto &ps = field.positions(); + // double *pos; + // pos = new double[numAtoms * 3]; + // for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + // auto atom = conf.getAtomPos(i); + // ps.push_back(&atom); + // pos[3 * i] = atom.x; + // pos[3 * i + 1] = atom.y; + // pos[3 * i + 2] = atom.z; + + // auto ac = new ForceFields::ANI::ANIAtomContrib( + // &field, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1ccx"); + // field.contribs().push_back(ForceFields::ContribPtr(ac)); + // } + // field.initialize(); + // CHECK(field.calcEnergy(pos) == (-56.1652_a).margin(0.05)); + // } + // SECTION("Ethanol") { + // std::string molFile = dirPath + "ethanol.sdf"; + + // RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + // int confId = -1; + // auto conf = mol->getConformer(confId); + // auto numAtoms = mol->getNumAtoms(); + // auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + // ForceFields::ForceField field; + // auto &ps = field.positions(); + // double *pos; + // pos = new double[numAtoms * 3]; + // for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + // auto atom = conf.getAtomPos(i); + // ps.push_back(&atom); + // pos[3 * i] = atom.x; + // pos[3 * i + 1] = atom.y; + // pos[3 * i + 2] = atom.z; + + // auto ac = new ForceFields::ANI::ANIAtomContrib( + // &field, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1ccx"); + // field.contribs().push_back(ForceFields::ContribPtr(ac)); + // } + // field.initialize(); + // CHECK(field.calcEnergy(pos) == (-154.8904_a).margin(0.05)); + // } + // } + + // TEST_CASE("ANI-1x NN Forward Pass", "[ANI Force Field]") { + // std::string pathName = getenv("RDBASE"); + // std::string dirPath = pathName + "/Code/GraphMol/Descriptors/test_data/"; + // SECTION("CH4") { + // std::string molFile = dirPath + "CH4.mol"; + + // RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + // int confId = -1; + // auto conf = mol->getConformer(confId); + // auto numAtoms = mol->getNumAtoms(); + // auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + // ForceFields::ForceField field; + // auto &ps = field.positions(); + // double *pos; + // pos = new double[numAtoms * 3]; + // for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + // auto atom = conf.getAtomPos(i); + // ps.push_back(&atom); + // pos[3 * i] = atom.x; + // pos[3 * i + 1] = atom.y; + // pos[3 * i + 2] = atom.z; + + // auto ac = new ForceFields::ANI::ANIAtomContrib( + // &field, speciesVec(i), i, speciesVec, numAtoms, 4, 8, "ANI-1x"); + // field.contribs().push_back(ForceFields::ContribPtr(ac)); + // } + // field.initialize(); + // CHECK(field.calcEnergy(pos) == (-40.0517_a).margin(0.05)); + // } + // SECTION("NH3") { + // std::string molFile = dirPath + "NH3.mol"; + + // RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + // int confId = -1; + // auto conf = mol->getConformer(confId); + // auto numAtoms = mol->getNumAtoms(); + // auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + // ForceFields::ForceField field; + // auto &ps = field.positions(); + // double *pos; + // pos = new double[numAtoms * 3]; + // for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + // auto atom = conf.getAtomPos(i); + // ps.push_back(&atom); + // pos[3 * i] = atom.x; + // pos[3 * i + 1] = atom.y; + // pos[3 * i + 2] = atom.z; + + // auto ac = new ForceFields::ANI::ANIAtomContrib( + // &field, speciesVec(i), i, speciesVec, numAtoms, 4, 8, "ANI-1x"); + // field.contribs().push_back(ForceFields::ContribPtr(ac)); + // } + // field.initialize(); + // CHECK(field.calcEnergy(pos) == (-56.1592_a).margin(0.05)); + // } + // SECTION("Ethanol") { + // std::string molFile = dirPath + "ethanol.sdf"; + + // RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + // int confId = -1; + // auto conf = mol->getConformer(confId); + // auto numAtoms = mol->getNumAtoms(); + // auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + // ForceFields::ForceField field; + // auto &ps = field.positions(); + // double *pos; + // pos = new double[numAtoms * 3]; + // for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + // auto atom = conf.getAtomPos(i); + // ps.push_back(&atom); + // pos[3 * i] = atom.x; + // pos[3 * i + 1] = atom.y; + // pos[3 * i + 2] = atom.z; + + // auto ac = new ForceFields::ANI::ANIAtomContrib( + // &field, speciesVec(i), i, speciesVec, numAtoms, 4, 8, "ANI-1x"); + // field.contribs().push_back(ForceFields::ContribPtr(ac)); + // } + // field.initialize(); + // CHECK(field.calcEnergy(pos) == (-154.9892_a).margin(0.05)); + // } + // } + // TEST_CASE("QM7 Test Cases") { + // SECTION("3C 1N and 5H Molecule") { + // int species[] = {6, 6, 6, 6, 7, 1, 1, 1, 1, 1}; + // unsigned int numAtoms = 10; + // auto speciesVec = + // RDKit::Descriptors::ANI::GenerateSpeciesVector(species, numAtoms); + // ForceFields::ForceField fieldANI1x, fieldANI1ccx; + + // double pos[] = { + // 1.8633455038070679, 0.02800574153661728, -0.012358808889985085, + // 4.697613716125488, -0.00013228082389105111, -0.005952637176960707, + // 5.985896587371826, -2.188642978668213, 0.009750986471772194, + // 6.029568195343018, 2.347965717315674, -0.011772993952035904, + // 7.106976509094238, 4.2567973136901855, -0.015174500644207, + // 1.120683193206787, 1.9597971439361572, 0.04142279550433159, + // 1.1187934875488281, -0.9710546731948853, 1.640320062637329, + // 1.1301696300506592, -0.8761904239654541, -1.7236380577087402, + // 5.016429424285889, -3.997413396835327, 0.014909938909113407, + // 8.040104866027832, -2.2334485054016113, 0.015911493450403214}; + // for (unsigned int i = 0; i < numAtoms; i++) { + // ForceFields::ANI::ANIAtomContrib *ac1; + // ac1 = new ForceFields::ANI::ANIAtomContrib( + // &fieldANI1x, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1x"); + // ForceFields::ANI::ANIAtomContrib *ac2; + // ac2 = new ForceFields::ANI::ANIAtomContrib(&fieldANI1ccx, + // speciesVec(i), + // i, speciesVec, numAtoms, + // 4, 8, "ANI-1ccx"); + // fieldANI1x.contribs().push_back(ForceFields::ContribPtr(ac1)); + // fieldANI1ccx.contribs().push_back(ForceFields::ContribPtr(ac2)); + // auto position = + // RDGeom::Point3D(pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]); + // fieldANI1ccx.positions().push_back(&position); + // fieldANI1x.positions().push_back(&position); + // } + // fieldANI1x.initialize(); + // fieldANI1ccx.initialize(); + // CHECK(fieldANI1x.calcEnergy(pos) == (-209.0046_a).margin(0.05)); + // CHECK(fieldANI1ccx.calcEnergy(pos) == (-208.9733_a).margin(0.05)); + // } + // SECTION("1N 3C 1O and 9H") { + // int species[] = {7, 6, 6, 6, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + // unsigned int numAtoms = 14; + // auto speciesVec = + // RDKit::Descriptors::ANI::GenerateSpeciesVector(species, numAtoms); + // ForceFields::ForceField fieldANI1x, fieldANI1ccx; + + // double pos[] = { + // 2.2074835300445557, -0.3340090811252594, 0.10053343325853348, + // 4.9639892578125, -0.22546322643756866, 0.1855711042881012, + // 5.859700679779053, 2.5101420879364014, -0.05463198199868202, + // 8.73183822631836, 2.706106662750244, -0.03679296746850014, + // 9.749720573425293, 1.7906666994094849, 2.2751736640930176, + // 1.6450822353363037, -2.170199394226074, 0.2544138431549072, + // 1.5863306522369385, 0.2723284363746643, -1.618361473083496, + // 5.743180274963379, -1.3758339881896973, -1.3486785888671875, + // 5.6071953773498535, -1.0400863885879517, 1.9756519794464111, + // 5.088220119476318, 3.6159720420837402, 1.5213806629180908, + // 5.141377925872803, 3.341905117034912, -1.8118693828582764, + // 9.32322883605957, 4.67402982711792, -0.26873794198036194, + // 9.555381774902344, 1.6062861680984497, -1.5811527967453003, + // 9.00974178314209, 2.783963441848755, 3.6356818675994873}; + // for (unsigned int i = 0; i < numAtoms; i++) { + // ForceFields::ANI::ANIAtomContrib *ac1; + // ac1 = new ForceFields::ANI::ANIAtomContrib( + // &fieldANI1x, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1x"); + // ForceFields::ANI::ANIAtomContrib *ac2; + // ac2 = new ForceFields::ANI::ANIAtomContrib(&fieldANI1ccx, + // speciesVec(i), + // i, speciesVec, numAtoms, + // 4, 8, "ANI-1ccx"); + // fieldANI1x.contribs().push_back(ForceFields::ContribPtr(ac1)); + // fieldANI1ccx.contribs().push_back(ForceFields::ContribPtr(ac2)); + // auto position = + // RDGeom::Point3D(pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]); + // fieldANI1ccx.positions().push_back(&position); + // fieldANI1x.positions().push_back(&position); + // } + // fieldANI1x.initialize(); + // fieldANI1ccx.initialize(); + // CHECK(fieldANI1x.calcEnergy(pos) == (-248.1921_a).margin(0.05)); + // CHECK(fieldANI1ccx.calcEnergy(pos) == (-248.2279_a).margin(0.05)); + // } + // SECTION("1N 5C 9H") { + // int species[] = {7, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + // unsigned int numAtoms = 15; + // auto speciesVec = + // RDKit::Descriptors::ANI::GenerateSpeciesVector(species, numAtoms); + // ForceFields::ForceField fieldANI1x, fieldANI1ccx; + + // double pos[] = { + // 2.1612987518310547, -0.6327747702598572, 0.43304964900016785, + // 4.886623859405518, -0.5855505466461182, 0.8615450263023376, + // 6.046708106994629, 1.7641916275024414, -0.3568369746208191, + // 8.887079238891602, 1.9741591215133667, 0.131562739610672, + // 10.33105754852295, 0.006821911316365004, -1.1970659494400024, + // 11.513798713684082, -1.6008626222610474, -2.2824490070343018, + // 1.4307305812835693, -2.2506449222564697, 1.1816647052764893, + // 1.8104143142700195, -0.7166597247123718, -1.4598512649536133, + // 5.720730304718018, -2.310190200805664, 0.07972754538059235, + // 5.243819713592529, -0.5787853002548218, 2.9002761840820312, + // 5.127204895019531, 3.4552319049835205, 0.416646808385849, + // 5.6790995597839355, 1.7595807313919067, -2.398723840713501, + // 9.267745971679688, 1.8809388875961304, 2.165493965148926, + // 9.537825584411621, 3.8325536251068115, -0.5140811204910278, + // 12.562162399291992, -3.02358078956604, -3.24534010887146}; + // for (unsigned int i = 0; i < numAtoms; i++) { + // ForceFields::ANI::ANIAtomContrib *ac1; + // ac1 = new ForceFields::ANI::ANIAtomContrib( + // &fieldANI1x, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1x"); + // ForceFields::ANI::ANIAtomContrib *ac2; + // ac2 = new ForceFields::ANI::ANIAtomContrib(&fieldANI1ccx, + // speciesVec(i), + // i, speciesVec, numAtoms, + // 4, 8, "ANI-1ccx"); + // fieldANI1x.contribs().push_back(ForceFields::ContribPtr(ac1)); + // fieldANI1ccx.contribs().push_back(ForceFields::ContribPtr(ac2)); + // auto position = + // RDGeom::Point3D(pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]); + // fieldANI1ccx.positions().push_back(&position); + // fieldANI1x.positions().push_back(&position); + // } + // fieldANI1x.initialize(); + // fieldANI1ccx.initialize(); + // CHECK(fieldANI1x.calcEnergy(pos) == (-249.0084_a).margin(0.05)); + // CHECK(fieldANI1ccx.calcEnergy(pos) == (-249.0295_a).margin(0.05)); + // } + // SECTION("5C 1O 8H") { + // int species[] = {6, 6, 6, 6, 6, 8, 1, 1, 1, 1, 1, 1, 1, 1}; + // unsigned int numAtoms = 14; + // auto speciesVec = + // RDKit::Descriptors::ANI::GenerateSpeciesVector(species, numAtoms); + // ForceFields::ForceField fieldANI1x, fieldANI1ccx; + + // double pos[] = { + // 1.9601751565933228, -0.061945222318172455, -0.08331802487373352, + // 4.777057647705078, -0.06096256524324417, -0.04117713123559952, + // 6.238533973693848, -1.251603364944458, -2.1706528663635254, + // 6.237986087799072, 1.5869730710983276, -1.860718846321106, + // 8.574311256408691, 2.8852715492248535, -1.034757375717163, + // 10.139514923095703, 3.6033108234405518, -2.578569173812866, + // 1.2324415445327759, 1.4809783697128296, 1.0859311819076538, + // 1.2382619380950928, -1.844051480293274, 0.6785250902175903, + // 1.2088199853897095, 0.1712280809879303, -1.997175931930542, + // 5.501691818237305, -0.3164535462856293, 1.858847975730896, + // 5.213395118713379, -2.030416250228882, -3.7652416229248047, + // 7.952043056488037, -2.279557704925537, -1.712791085243225, + // 5.169175624847412, 2.650114059448242, -3.2528233528137207, + // 8.815553665161133, 3.1873443126678467, 1.0119673013687134, + // }; + // for (unsigned int i = 0; i < numAtoms; i++) { + // ForceFields::ANI::ANIAtomContrib *ac1; + // ac1 = new ForceFields::ANI::ANIAtomContrib( + // &fieldANI1x, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1x"); + // ForceFields::ANI::ANIAtomContrib *ac2; + // ac2 = new ForceFields::ANI::ANIAtomContrib(&fieldANI1ccx, + // speciesVec(i), + // i, speciesVec, numAtoms, + // 4, 8, "ANI-1ccx"); + // fieldANI1x.contribs().push_back(ForceFields::ContribPtr(ac1)); + // fieldANI1ccx.contribs().push_back(ForceFields::ContribPtr(ac2)); + // auto position = + // RDGeom::Point3D(pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]); + // fieldANI1ccx.positions().push_back(&position); + // fieldANI1x.positions().push_back(&position); + // } + // fieldANI1x.initialize(); + // fieldANI1ccx.initialize(); + // CHECK(fieldANI1x.calcEnergy(pos) == (-269.0078_a).margin(0.05)); + // CHECK(fieldANI1ccx.calcEnergy(pos) == (-269.0295_a).margin(0.05)); + // } + // SECTION("6C 1N 13H") { + // int species[] = {6, 6, 6, 7, 6, 6, 6, 1, 1, 1, + // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + // unsigned int numAtoms = 20; + // auto speciesVec = + // RDKit::Descriptors::ANI::GenerateSpeciesVector(species, numAtoms); + // ForceFields::ForceField fieldANI1x, fieldANI1ccx; + + // double pos[] = { + // 1.6804956197738647, -0.2058289647102356, 0.3033577501773834, + // 4.54233455657959, -0.02983877621591091, -0.05497213453054428, + // 5.335660457611084, -0.09013993293046951, -2.8519558906555176, + // 4.461907863616943, 2.1463699340820312, -4.214334964752197, + // 5.836381435394287, 2.0427372455596924, 1.597517728805542, + // 7.893631935119629, 0.09807678312063217, 2.2748334407806396, + // 6.003244400024414, -2.0027129650115967, 1.5839306116104126, + // 1.1721593141555786, -0.3195337951183319, 2.3073368072509766, + // 0.9210147261619568, -1.8902552127838135, -0.6298835277557373, + // 0.7200612425804138, 1.4526702165603638, -0.47447243332862854, + // 4.586913585662842, -1.7891360521316528, -3.771118640899658, + // 7.397408485412598, -0.17650042474269867, -3.0236940383911133, + // 2.5398108959198, 2.1276614665985107, -4.326868057250977, + // 5.0936431884765625, 2.0650928020477295, -6.032308101654053, + // 4.723445892333984, 2.6494150161743164, 3.2372143268585205, + // 6.513205528259277, 3.728240728378296, 0.6133106350898743, + // 9.554058074951172, 0.17268317937850952, 1.0386879444122314, + // 8.529033660888672, 0.1181078851222992, 4.241074562072754, + // 6.8076629638671875, -3.61893892288208, 0.5778782367706299, + // 4.953671455383301, -2.7142891883850098, 3.2221720218658447, + + // }; + // for (unsigned int i = 0; i < numAtoms; i++) { + // ForceFields::ANI::ANIAtomContrib *ac1; + // ac1 = new ForceFields::ANI::ANIAtomContrib( + // &fieldANI1x, speciesVec(i), i, speciesVec, numAtoms, 4, 8, + // "ANI-1x"); + // ForceFields::ANI::ANIAtomContrib *ac2; + // ac2 = new ForceFields::ANI::ANIAtomContrib(&fieldANI1ccx, + // speciesVec(i), + // i, speciesVec, numAtoms, + // 4, 8, "ANI-1ccx"); + // fieldANI1x.contribs().push_back(ForceFields::ContribPtr(ac1)); + // fieldANI1ccx.contribs().push_back(ForceFields::ContribPtr(ac2)); + // auto position = + // RDGeom::Point3D(pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]); + // fieldANI1ccx.positions().push_back(&position); + // fieldANI1x.positions().push_back(&position); + // } + // fieldANI1x.initialize(); + // fieldANI1ccx.initialize(); + // CHECK(fieldANI1x.calcEnergy(pos) == (-289.1283_a).margin(0.05)); + // CHECK(fieldANI1ccx.calcEnergy(pos) == (-289.1044_a).margin(0.05)); + // } +} diff --git a/Code/ForceField/ANI/AtomicContrib.cpp b/Code/ForceField/ANI/AtomicContrib.cpp new file mode 100644 index 00000000000..3d78741485b --- /dev/null +++ b/Code/ForceField/ANI/AtomicContrib.cpp @@ -0,0 +1,680 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include "AtomicContrib.h" +#include +#include +#include +#include +#include +#include +#include +using namespace Eigen; + +namespace ForceFields { +namespace ANI { +ANIAtomContrib::ANIAtomContrib(ForceField *owner, int atomType, + unsigned int atomIdx, VectorXi &speciesVec, + unsigned int numAtoms, unsigned int numLayers, + unsigned int ensembleSize, + std::string modelType) { + PRECONDITION(owner, "Bad Owner") + PRECONDITION(atomType == 0 || atomType == 1 || atomType == 2 || atomType == 3, + "Atom Type not Supported"); + PRECONDITION(modelType == "ANI-1x" || modelType == "ANI-1ccx", + "Model Not currently supported") + PRECONDITION(ensembleSize > 0, + "There must be at least 1 model in the ensemble"); + URANGE_CHECK(atomIdx, numAtoms); + dp_forceField = owner; + this->d_atomType = atomType; + this->d_atomIdx = atomIdx; + this->d_speciesVec = speciesVec; + this->d_numAtoms = numAtoms; + this->d_ensembleSize = ensembleSize; + this->d_modelType = modelType; + + if (this->d_atomEncoding.find(this->d_atomType) != + this->d_atomEncoding.end()) { + auto atomicSymbol = this->d_atomEncoding[this->d_atomType]; + for (unsigned int modelNum = 0; modelNum < ensembleSize; modelNum++) { + std::vector currModelWeights; + std::vector currModelBiases; + Utils::loadFromBin(&currModelWeights, &currModelBiases, modelNum, + atomicSymbol, this->d_modelType); + this->d_weights.push_back(currModelWeights); + this->d_biases.push_back(currModelBiases); + } + Utils::loadSelfEnergy(&(this->d_selfEnergy), atomicSymbol, + this->d_modelType); + } else { + this->d_selfEnergy = 0; + } + + // Different values for means of the gaussian symmetry functions + std::string path = getenv("RDBASE"); + std::string paramFilePath = + path + "/Code/ForceField/ANI/Params/" + modelType + "/AEVParams/"; + + // Weights for the radial symmetry functions + ArrayXd ShfR; + RDNumeric::EigenSerializer::deserialize(ShfR, paramFilePath + "ShfR.bin"); + // Variance terms for the gaussian symmetry functions + ArrayXd EtaR; + RDNumeric::EigenSerializer::deserialize(EtaR, paramFilePath + "EtaR.bin"); + + // Weights for the angular symmetry functions + ArrayXd ShfZ; + RDNumeric::EigenSerializer::deserialize(ShfZ, paramFilePath + "ShfZ.bin"); + ArrayXd ShfA; + RDNumeric::EigenSerializer::deserialize(ShfA, paramFilePath + "ShfA.bin"); + // distance wise shifts in the distance term of the angular symmetry function + + ArrayXd zeta; + RDNumeric::EigenSerializer::deserialize(zeta, paramFilePath + "zeta.bin"); + ArrayXd etaA; + RDNumeric::EigenSerializer::deserialize(etaA, paramFilePath + "etaA.bin"); + + this->d_aevParams.insert(std::make_pair("ShfR", ShfR)); + this->d_aevParams.insert(std::make_pair("EtaR", EtaR)); + this->d_aevParams.insert(std::make_pair("ShfZ", ShfZ)); + this->d_aevParams.insert(std::make_pair("ShfA", ShfA)); + this->d_aevParams.insert(std::make_pair("zeta", zeta)); + this->d_aevParams.insert(std::make_pair("etaA", etaA)); +} + +double ANIAtomContrib::forwardProp(ArrayXXd &aev) const { + if (this->d_atomType == -1) { + return 0; + } + + if (aev.cols() != 1) { + aev.transposeInPlace(); + } + + MatrixXd aevMat = aev.matrix(); + + std::vector energies; + energies.reserve(this->d_weights.size()); + for (unsigned int modelNo = 0; modelNo < this->d_weights.size(); modelNo++) { + auto temp = aevMat; + for (unsigned int layer = 0; layer < this->d_weights[modelNo].size(); + layer++) { + temp = ((this->d_weights[modelNo][layer] * temp) + + this->d_biases[modelNo][layer]) + .eval(); + if (layer < this->d_weights[modelNo].size() - 1) { + Utils::CELU(temp, 0.1); + } + } + energies.push_back(temp.coeff(0, 0)); + } + return std::accumulate(energies.begin(), energies.end(), 0.0) / + energies.size(); +} + +double ANIAtomContrib::getEnergy(double *pos) const { + auto aev = RDKit::Descriptors::ANI::AtomicEnvironmentVector( + pos, this->d_speciesVec, this->d_numAtoms, &(this->d_aevParams)); + ArrayXXd row = aev.row(this->d_atomIdx); + return this->ANIAtomContrib::forwardProp(row) + this->d_selfEnergy; +} + +double ANIAtomContrib::getEnergy(Eigen::ArrayXXd &aev) const { + ArrayXXd row = aev.row(this->d_atomIdx); + return this->ANIAtomContrib::forwardProp(row) + this->d_selfEnergy; +} + +void ANIAtomContrib::getGrad(double *pos, double *grad) const { + auto aev = RDKit::Descriptors::ANI::AtomicEnvironmentVector( + pos, this->d_speciesVec, this->d_numAtoms, &(this->d_aevParams)); + + MatrixXd row = aev.row(this->d_atomIdx).matrix(); + std::vector hiddenStates; + std::vector grads; + for (unsigned int modelNo = 0; modelNo < this->d_weights.size(); modelNo++) { + auto temp = row; + for (unsigned int layer = 0; layer < this->d_weights[modelNo].size(); + layer++) { + temp = ((this->d_weights[modelNo][layer] * temp) + + this->d_biases[modelNo][layer]) + .eval(); + hiddenStates.push_back(temp); + if (layer < this->d_weights[modelNo].size() - 1) { + Utils::CELU(temp, 0.1); + } + } + MatrixXd gradient = MatrixXd::Identity(this->d_weights[modelNo][0].cols(), + this->d_weights[modelNo][0].cols()); + for (unsigned int i = 0; i < this->d_weights[modelNo].size() - 1; i++) { + Utils::CELUGrad(hiddenStates[i], 0.1); + auto k = hiddenStates[i].asDiagonal() * this->d_weights[modelNo][i]; + gradient = (k * gradient).eval(); + } + gradient = this->d_weights[modelNo][this->d_weights[modelNo].size() - 1] * + gradient; + grads.push_back(gradient); + hiddenStates.clear(); + } + MatrixXd final_grad = MatrixXd::Zero(row.rows(), row.cols()); + for (auto i : grads) { + final_grad += i; + } + final_grad = final_grad / this->d_ensembleSize; + + // AEV derivative w.r.t position + MatrixXd radialPart(4, 16); + unsigned int col = 0; + for (int i = 0; i < 64; i++) { + radialPart(i / 16, col) = row(i, 0); + col++; + if (i % 16 == 0) { + col = 0; + } + } + auto numAtoms = this->d_numAtoms; + auto species = this->d_speciesVec; + ArrayXXd coordinates(numAtoms, 3); + for (unsigned int i = 0; i < numAtoms; i++) { + coordinates.row(i) << pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]; + } + // Fetch pairs of atoms which are neigbours which lie within the cutoff + // distance 5.2 Angstroms. The constant was obtained by authors of torchANI + ArrayXi atomIndex12; + RDKit::Descriptors::ANI::NeighborPairs(&coordinates, &species, 5.2, numAtoms, + &atomIndex12); + ArrayXXd selectedCoordinates(atomIndex12.rows(), 3); + RDKit::Descriptors::ANI::IndexSelect(&selectedCoordinates, &coordinates, + atomIndex12, 0); + + // Vectors between pairs of atoms that lie in each other's neighborhoods + unsigned int numPairs = selectedCoordinates.rows() / 2; + ArrayXXd vec(numPairs, 3); + for (unsigned int i = 0; i < numPairs; i++) { + vec.row(i) = + selectedCoordinates.row(i) - selectedCoordinates.row(i + numPairs); + } + + ArrayXXd distances = vec.matrix().rowwise().norm().array(); + + ArrayXXi species12(2, numPairs); + ArrayXXi species12Flipped(2, numPairs); + ArrayXXi atomIndex12Unflattened(2, numPairs); + for (unsigned int i = 0; i < numPairs; i++) { + species12(0, i) = species(atomIndex12(i)); + species12(1, i) = species(atomIndex12(i + numPairs)); + + species12Flipped(1, i) = species(atomIndex12(i)); + species12Flipped(0, i) = species(atomIndex12(i + numPairs)); + + atomIndex12Unflattened(0, i) = atomIndex12(i); + atomIndex12Unflattened(1, i) = atomIndex12(i + numPairs); + } + std::map> addedMapping; + for (int i = 4 * this->d_atomIdx; i < 4 * this->d_atomIdx + 4; i++) { + std::vector k; + addedMapping.insert(std::make_pair(i, k)); + } + auto index12 = (atomIndex12Unflattened * 4 + species12Flipped).transpose(); + for (auto idxCol = 0; idxCol < index12.cols(); idxCol++) { + for (auto i = 0; i < index12.rows(); i++) { + for (auto v = addedMapping.begin(); v != addedMapping.end(); v++) { + if (index12(i, idxCol) == v->first) { + addedMapping[v->first].push_back(i); + } + } + } + } + std::vector derivatives; + Utils::RadialTerms_d(5.2, derivatives, addedMapping, selectedCoordinates, + &(this->d_aevParams), distances, atomIndex12, + this->d_atomIdx); + ArrayXXd RadialJacobian = ArrayXXd::Zero(64, 3); + unsigned int idx = 0; + for (auto i : derivatives) { + for (int j = 0; j < i.rows(); j++) { + RadialJacobian.row(idx) << i.row(j); + idx++; + } + } + ArrayXi evenCloserIndices((distances.array() <= 3.5).count()); + idx = 0; + for (auto i = 0; i < distances.size(); i++) { + if (distances(i) <= 3.5) { + evenCloserIndices(idx) = i; + idx++; + } + } + + std::vector> subtractionIndex; + + for (int i = 0; i < evenCloserIndices.size(); i++) { + subtractionIndex.push_back(std::make_pair(evenCloserIndices(i), evenCloserIndices(i) + numPairs)); + } + + ArrayXXi species12Angular(2, evenCloserIndices.size()); + ArrayXXi atomIndex12Angular(2, evenCloserIndices.size()); + + ArrayXXd vecAngular(evenCloserIndices.size(), 3); + + RDKit::Descriptors::ANI::IndexSelect(&species12Angular, &species12, + evenCloserIndices, 1); + RDKit::Descriptors::ANI::IndexSelect( + &atomIndex12Angular, &atomIndex12Unflattened, evenCloserIndices, 1); + RDKit::Descriptors::ANI::IndexSelect(&vecAngular, &vec, evenCloserIndices, 0); + + auto n = evenCloserIndices.size(); + std::pair, ArrayXXi> tripletInfo; + + RDKit::Descriptors::ANI::TripleByMolecules(&atomIndex12Angular, &tripletInfo); + auto pairIndex12 = tripletInfo.second; + auto centralAtomIndex = tripletInfo.first; + ArrayXXi sign12(2, pairIndex12.cols()); + + // compute mapping between representation of central-other to pair + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + if (pairIndex12(i, j) < n) { + sign12(i, j) = 1; + } else { + sign12(i, j) = -1; + } + } + } + + n = atomIndex12Angular.cols(); + + // pairIndex12 = pairindex12 % n + auto localIndex = pairIndex12.cast(); + + pairIndex12 = + (localIndex.array() - (localIndex.array() / n).array() * n).array(); + + std::map> vecCoordMapping; + for (int i = 0; i < evenCloserIndices.size(); i++) { + auto ans = std::make_pair( + evenCloserIndices(i), + std::make_pair( + selectedCoordinates.row(evenCloserIndices(i)), + selectedCoordinates.row(evenCloserIndices(i) + numPairs))); + } + + + ArrayXi pairIndex12Flattened(2 * pairIndex12.cols()); + idx = 0; + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + pairIndex12Flattened(idx) = pairIndex12(i, j); + idx++; + } + } + + ArrayXXd vecFlattened(pairIndex12Flattened.size(), 3); + RDKit::Descriptors::ANI::IndexSelect(&vecFlattened, &vecAngular, + pairIndex12Flattened, 0); + ArrayXXi atomIndex12AngularPairs(2, pairIndex12Flattened.size()); + RDKit::Descriptors::ANI::IndexSelect(&atomIndex12AngularPairs, &atomIndex12Angular, pairIndex12Flattened, 1); + + // for (int i = 0; i < atomIndex12AngularPairs.cols(); i++) { + // std::cout << coordinates.row(atomIndex12AngularPairs(0,i)) - coordinates.row(atomIndex12AngularPairs(1,i)) << std::endl; + // std::cout << vecFlattened.row(i) << std::endl; + // std::cout << "~~~~~~~~~~~~~" << std::endl; + // } + + // std::cout << "atomIndex12AngularPairs" << std::endl; + // std::cout << atomIndex12AngularPairs << std::endl; + // std::cout << "atomIndex12AngularPairs Ended" << std::endl; + + ArrayXXd vec12(vecFlattened.rows(), 3); + for (auto i = 0; i < vecFlattened.rows() / 2; i++) { + vec12.row(i) = vecFlattened.row(i) * sign12(0, i); + if (sign12(0, i) == -1) { + auto temp = atomIndex12AngularPairs(0, i); + atomIndex12AngularPairs(0, i) = atomIndex12AngularPairs(1, i); + atomIndex12AngularPairs(1, i) = temp; + } + } + + for (auto i = vecFlattened.rows() / 2; i < vecFlattened.rows(); i++) { + vec12.row(i) = vecFlattened.row(i) * sign12(1, i - vecFlattened.rows() / 2); + if (sign12(1, i - vecFlattened.rows() / 2) == -1) { + auto temp = atomIndex12AngularPairs(0, i); + atomIndex12AngularPairs(0, i) = atomIndex12AngularPairs(1, i); + atomIndex12AngularPairs(1, i) = temp; + } + } + std::vector angularDerivatives; + ArrayXXi centralAtomIndexArr(centralAtomIndex.size(), 1); + + for (size_t i = 0; i < centralAtomIndex.size(); i++) { + centralAtomIndexArr.row(i) << centralAtomIndex[i]; + } + + Utils::AngularTerms_d(3.5, angularDerivatives, coordinates, vec12, this->d_atomIdx, atomIndex12AngularPairs, centralAtomIndexArr, &(this->d_aevParams)); + // for (auto i : angularDerivatives) { + // std::cout << i.rows() << " " << i.cols() << std::endl; + // } + // std::cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << std::endl; + // std::cout << angularDerivatives.size() << std::endl; + // std::cout << "=============================================" << std::endl; + + + ArrayXXi species12Small1(2, pairIndex12.cols()); + ArrayXXi species12Small2(2, pairIndex12.cols()); + + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + species12Small1(i, j) = species12Angular(0, pairIndex12(i, j)); + } + } + + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + species12Small2(i, j) = species12Angular(1, pairIndex12(i, j)); + } + } + + ArrayXXi species12_(sign12.rows(), sign12.cols()); + + for (auto i = 0; i < sign12.rows(); i++) { + for (auto j = 0; j < sign12.cols(); j++) { + if (sign12(i, j) == 1) { + species12_(i, j) = species12Small2(i, j); + } else { + species12_(i, j) = species12Small1(i, j); + } + } + } + + ArrayXXi index(species12_.cols(), 1); + ArrayXXi triuIndices; + RDKit::Descriptors::ANI::TriuIndex(4, triuIndices); + + for (auto i = 0; i < species12_.cols(); i++) { + index.row(i) = triuIndices(species12_(0, i), species12_(1, i)); + } + // The constant 10 comes from 10 pairs that can be formed + index = index + (centralAtomIndexArr.array() * 10).array(); + + std::vector sumDerivatives; + for (int i = 0; i < 10 * numAtoms; i++) { + sumDerivatives.push_back(ArrayXXd::Zero(32, 3)); + } + + for (auto idxCol = 0; idxCol < index.cols(); idxCol++) { + for (auto i = 0; i < index.rows(); i++) { + for (unsigned int j = 0; j < 10 * numAtoms; j++) { + if (index(i, idxCol) == (int)j) { + sumDerivatives[j] += angularDerivatives[i]; + } + } + } + } + std::vector reqd; + reqd.reserve(10); + for (int i = 10 * this->d_atomIdx; i < 10 * this->d_atomIdx + 10; i++) { + reqd.push_back(sumDerivatives[i]); + } + + ArrayXXd AngularJacobian = ArrayXXd::Zero(320, 3); + idx = 0; + for (auto i : reqd) { + for (int j = 0; j < i.rows(); j++) { + AngularJacobian.row(idx) << i.row(j); + idx++; + } + } + // // std::cout << "AngularJacobian" << std::endl; + // // std::cout << AngularJacobian << std::endl; + + ArrayXXd FinalJacobian(384, 3); + FinalJacobian << RadialJacobian, AngularJacobian; + // // std::cout << FinalJacobian << std::endl; + + // std::cout << final_grad.rows() << " " << final_grad.cols() << std::endl; + // std::cout << FinalJacobian.rows() << " " << FinalJacobian.cols() << std::endl; + auto gradient = final_grad.matrix() * FinalJacobian.matrix(); + grad[3 * this->d_atomIdx] = gradient(0); + grad[3 * this->d_atomIdx + 1] = gradient(1); + grad[3 * this->d_atomIdx + 2] = gradient(2); + +} + +namespace Utils { + +void RadialTerms_d(double cutoff, std::vector &derivatives, + std::map> &addedMapping, + ArrayXXd &selectedCoordinates, + const std::map *params, + ArrayXXd &distances, ArrayXi &atomIndex12, + unsigned int atomIdx) { + ArrayXd EtaR = params->find("EtaR")->second; + ArrayXd ShfR = params->find("ShfR")->second; + auto numPairs = selectedCoordinates.rows() / 2; + for (auto i = addedMapping.begin(); i != addedMapping.end(); i++) { + auto addedRows = i->second; + ArrayXXd der = ArrayXXd::Zero(16, 3); + for (auto v : addedRows) { + auto idx1 = atomIndex12(v); + auto idx2 = atomIndex12(v + numPairs); + auto dist = distances(v); + auto coord1 = selectedCoordinates.row(v); + auto coord2 = selectedCoordinates.row(v + numPairs); + int multi = 1; + if (atomIdx == idx1) { + multi = 1; + } + if (atomIdx == idx2) { + multi = -1; + } + auto vec = multi * (coord1 - coord2) / dist; + for (auto etaIdx = 0; etaIdx < EtaR.size(); etaIdx++) { + ArrayXXd term1 = ((ShfR - dist).pow(2) * EtaR(etaIdx) * -1).exp(); + ArrayXXd term2 = + (-M_PI / (2 * cutoff) * std::sin((M_PI * dist / cutoff))) + + EtaR(etaIdx) * (ShfR - dist) * + (std::cos((M_PI * dist / cutoff)) + 1); + auto intermediate = 0.25 * term1 * term2; + for (int k = 0; k < intermediate.size(); ++k) { + der.row(k) += vec * intermediate(k); + } + } + } + derivatives.push_back(der); + } +} + +void AngularTerms_d(double cutoff, std::vector &derivatives, ArrayXXd coordinates, + ArrayXXd &vectors12, unsigned int atomIdx, ArrayXXi &atomIndex12Angular, ArrayXXi centralAtomIndex, + const std::map *params) { + ArrayXd ShfZ = params->find("ShfZ")->second; + ArrayXd ShfA = params->find("ShfA")->second; + ArrayXd zeta = params->find("zeta")->second; + ArrayXd etaA = params->find("etaA")->second; + + for (int i = 0; i < centralAtomIndex.size(); i++) { + // if (centralAtomIndex(i) != atomIdx) { + // continue; + // } + + auto vecij = vectors12.matrix().row(i); + auto vecik = vectors12.matrix().row(i + vectors12.rows() / 2); + + auto Rij = vecij.norm(); + auto Rik = vecik.norm(); + + auto dotProduct = vecij.dot(vecik); + auto cutoff_ij = 0.5 * (std::cos(M_PI * Rij / cutoff) + 1); + auto cutoff_ik = 0.5 * (std::cos(M_PI * Rik / cutoff) + 1); + auto thetaijk = std::acos(0.95 * dotProduct / (Rij * Rik)); + unsigned int idx = 0; + + auto idx_i = atomIndex12Angular(0, i); + auto idx2 = atomIndex12Angular(1, i); + auto idx_j = atomIndex12Angular(0, i + vectors12.rows() / 2); + auto idx_k = atomIndex12Angular(1, i + vectors12.rows() / 2); + + ArrayXXd der(32, 3); + for (int ShfZidx = 0; ShfZidx < ShfZ.size(); ShfZidx++) { + for (int ShfAidx = 0; ShfAidx < ShfA.size(); ShfAidx++) { + for (int zetaidx = 0; zetaidx < zeta.size(); zetaidx++) { + for (int etaAidx = 0; etaAidx < etaA.size(); etaAidx++) { + auto expTerm = std::exp(-etaA(etaAidx) * std::pow((Rij + Rik)/2 - ShfA(ShfAidx), 2)); + auto term1 = 0.95 * (zeta(zetaidx)/(Rij * Rik)) * cutoff_ij * cutoff_ik; + term1 *= (std::pow(std::cos(thetaijk - ShfZ(ShfZidx) + 1), zeta(zetaidx) - 1) * std::sin(thetaijk - ShfZ(ShfZidx)) * expTerm); + auto vec = vecij * (1 - dotProduct / (Rij * Rij)) + vecik * (1 - dotProduct / (Rik * Rik)); + auto part1 = term1 * vec; + auto part2 = M_PI * vecik * expTerm * cutoff_ij * std::sin(M_PI * Rik / cutoff) * std::pow(std::cos(thetaijk - ShfZ(ShfZidx)), zeta(zetaidx)) / (2 * cutoff * Rik); + auto part3 = M_PI * vecij * expTerm * cutoff_ik * std::sin(M_PI * Rij / cutoff) * std::pow(std::cos(thetaijk - ShfZ(ShfZidx)), zeta(zetaidx)) / (2 * cutoff * Rij); + auto part4 = etaA(etaAidx) * ((vecik / Rik) + (vecij / Rij)) * ((Rij + Rik) / 2 - ShfA(ShfAidx)) * expTerm * cutoff_ik * cutoff_ij * std::pow(std::cos(thetaijk - ShfZ(ShfZidx)), zeta(zetaidx)); + // std::cout << std::pow(2, 1 - zeta(zetaidx)) * (part1 - part2 - part3 - part4) << std::endl; + // std::cout << "Part 1 " << part1 << std::endl; + // std::cout << "Part 2 " << part2 << std::endl; + // std::cout << "Part 3 " << part3 << std::endl; + // std::cout << "Part 4 " << part4 << std::endl; + der.row(idx) << (std::pow(2, 1 - zeta(zetaidx)) * (part1 - part2 - part3 - part4)).array(); + idx++; + } + } + } + } + derivatives.push_back(der); + } +} + +void CELU(MatrixXd &input, double alpha) { + input = input.unaryExpr([&](double val) { + return std::max(0.0, val) + + std::min(alpha * (std::exp(val / alpha) - 1), 0.0); + }); +} + +void CELUGrad(MatrixXd &input, double alpha) { + input = input.unaryExpr([&](double val) { + if (val > 0) { + return 1.0; + } else { + return std::exp(val / alpha); + } + }); +} + +std::vector tokenize(const std::string &s) { + boost::char_separator sep(", \n\r\t"); + boost::tokenizer> tok(s, sep); + std::vector tokens; + std::copy(tok.begin(), tok.end(), + std::back_inserter>(tokens)); + return tokens; +} + +void loadFromBin(std::vector *weights, unsigned int model, + std::string weightType, unsigned int layer, + std::string atomType, std::string modelType) { + std::string path = getenv("RDBASE"); + std::string paramFile = path + "/Code/ForceField/ANI/Params/" + modelType + + "/model" + std::to_string(model) + "/" + atomType + + "_" + std::to_string(layer) + "_" + weightType + + ".bin"; + MatrixXf weight; + RDNumeric::EigenSerializer::deserialize(weight, paramFile); + weights->push_back(weight.cast()); +} + +void loadFromBin(std::vector *weights, std::vector *biases, + unsigned int model, std::string atomType, + std::string modelType) { + std::string path = getenv("RDBASE"); + std::string paramFile = path + "/Code/ForceField/ANI/Params/" + modelType + + "/model" + std::to_string(model) + ".bin"; + std::vector floatWeights, floatBiases; + RDNumeric::EigenSerializer::deserializeAll(&floatWeights, &floatBiases, + paramFile, atomType); + for (unsigned int i = 0; i < floatWeights.size(); i++) { + weights->push_back(floatWeights[i].cast()); + biases->push_back(floatBiases[i].cast()); + } +} + +void loadFromCSV(std::vector *weights, unsigned int model, + std::string weightType, unsigned int layer, + std::string atomType, std::string modelType) { + std::string path = getenv("RDBASE"); + std::string paramFile = path + "/Code/ForceField/ANI/Params/" + modelType + + "/model" + std::to_string(model) + "/" + atomType + + "_" + std::to_string(layer) + "_" + weightType; + + std::ifstream instrmSF(paramFile.c_str()); + if (!instrmSF.good()) { + throw ValueErrorException(paramFile + " Model File does not exist"); + return; + } + std::string line; + std::vector tokens; + std::vector> weight; + unsigned int cols = 1; + while (!instrmSF.eof()) { + std::getline(instrmSF, line); + tokens = tokenize(line); + std::vector row; + for (auto v : tokens) { + std::istringstream os(v); + double d; + os >> d; + row.push_back(d); + } + if (row.size() > 0) { + cols = row.size(); + weight.push_back(row); + } + } + + MatrixXd param(weight.size(), cols); + + for (unsigned int i = 0; i < weight.size(); i++) { + for (unsigned int j = 0; j < weight[i].size(); j++) { + param(i, j) = weight[i][j]; + } + } + weights->push_back(param); +} + +void loadSelfEnergy(double *energy, std::string atomType, + std::string modelType) { + std::string path = getenv("RDBASE"); + std::string filePath = + path + "/Code/ForceField/ANI/Params/" + modelType + "/selfEnergies"; + + std::ifstream selfEnergyFile(filePath.c_str()); + if (!selfEnergyFile.good()) { + throw ValueErrorException(filePath + " : File Does Not Exist"); + return; + } + std::string line; + while (!selfEnergyFile.eof()) { + std::getline(selfEnergyFile, line); + boost::char_separator sep(" ,="); + boost::tokenizer> tok(line, sep); + std::vector tokens; + std::copy(tok.begin(), tok.end(), + std::back_inserter>(tokens)); + + if (tokens[0] == atomType) { + std::istringstream os(tokens[2]); + os >> *energy; + break; + } + } + selfEnergyFile.close(); +} + +} // namespace Utils +} // namespace ANI +} // namespace ForceFields \ No newline at end of file diff --git a/Code/ForceField/ANI/AtomicContrib.h b/Code/ForceField/ANI/AtomicContrib.h new file mode 100644 index 00000000000..0254ddcc05e --- /dev/null +++ b/Code/ForceField/ANI/AtomicContrib.h @@ -0,0 +1,148 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include +#ifndef __RD_ANI_H__ +#define __RD_ANI_H__ + +#include +#include + +#ifdef RDK_HAS_EIGEN3 +#include +#include +using namespace Eigen; + +namespace ForceFields { +namespace ANI { + +//! Atomic contribution term from Atomic Environment Vectors using ANI models +class RDKIT_FORCEFIELD_EXPORT ANIAtomContrib : public ForceFieldContrib { + public: + ANIAtomContrib(){}; + //! Constructor + /*! + The contribution is found according to the AEV, atom type along with + hyperparameters and weights, biases of the nueral network + + \param owner pointer to the owning ForceField + \param atomType ANI currently supports H.C, N and O + \param atomIdx index of atom in ForceField's positions + \param speciesVec vector with atom wise encoding + \param numAtoms number of atoms in the molecule + \param numLayers number of layers in the neural network + \param ensembleSize number of models in the ensemble + \param modelType model types like ANI-1x and ANI-1ccx + */ + ANIAtomContrib(ForceField *owner, int atomType, unsigned int atomIdx, + VectorXi &speciesVec, unsigned int numAtoms, + unsigned int numLayers, unsigned int ensembleSize, + std::string modelType); + double getEnergy(double *pos) const; + double getEnergy(Eigen::ArrayXXd &aev) const; + void getGrad(double *pos, double *grad) const; + + /*! + Find atomic contribution according to atom's interactions with other atoms + by forward prpogation through the neural network + + \param aev Atomic Environment Vector of the atom + + \return Contribtution to the total energy of molecule according to + interactions + */ + double forwardProp(ArrayXXd &aev) const; + + virtual ANIAtomContrib *copy() const { return new ANIAtomContrib(*this); }; + + private: + int d_atomType; + int d_atomIdx; + int d_numAtoms; + VectorXi d_speciesVec; + std::vector> d_weights; + std::vector> d_biases; + double d_selfEnergy; + unsigned int d_ensembleSize; + std::string d_modelType; + std::map d_atomEncoding = { + {0, "H"}, {1, "C"}, {2, "N"}, {3, "O"}}; + std::map d_aevParams; +}; + +namespace Utils { +void AngularTerms_d(double cutoff, std::vector &derivatives, ArrayXXd coordinates, + ArrayXXd &vectors12, unsigned int atomIdx, ArrayXXi &atomIndex12Angular, ArrayXXi centralAtomIndex, + const std::map *params); +void RadialTerms_d(double cutoff, std::vector &derivatives, + std::map> &addedMapping, + ArrayXXd &selectedCoordinates, + const std::map *params, + ArrayXXd &distances, ArrayXi &atomIndex12, + unsigned int atomIdx); +//! CELU activation function +/*! + Continuously Differentiable Exponential Linear Unit Activation function + \param input Vector from hidden layer + \param alpha hyperparameter for CELU +*/ +void CELU(MatrixXd &input, double alpha); + +void CELUGrad(MatrixXd &input, double alpha); + +/*! + Load model weights from CSV file + \param weights Pointer to array of weights of neural network + \param model Index of model in the ensemble + \param weightType Type of weights "weight" or "bias" + \param layer Index of layer of NN + \param atomType Atomic Symbol of atom + \param modelType Architecture being used +*/ +void loadFromCSV(std::vector *weights, unsigned int model, + std::string weightType, unsigned int layer, + std::string atomType, std::string modelType); + +/*! + Load model weights boost serialized files + \param weights Pointer to array of weights of neural network + \param model Index of model in the ensemble + \param weightType Type of weights "weight" or "bias" + \param layer Index of layer of NN + \param atomType Atomic Symbol of atom + \param modelType Architecture being used +*/ +void loadFromBin(std::vector *weights, unsigned int model, + std::string weightType, unsigned int layer, + std::string atomType, std::string modelType); + +/*! + Load all model weights from a single boost serialized file + \param weights Pointer to array of weights of neural network + \param biases Pointer to array of biases of neural network + \param model Index of model in the ensemble + \param atomType Atomic Symbol of atom + \param modelType Architecture being used +*/ +void loadFromBin(std::vector *weights, std::vector *biases, + unsigned int model, std::string atomType, + std::string modelType); + +//! Load self energy of atom from modelType/selfEnergies file +void loadSelfEnergy(double *energy, std::string atomType, + std::string modelType); + +std::vector tokenize(const std::string &s); + +} // namespace Utils +} // namespace ANI +} // namespace ForceFields +#endif +#endif \ No newline at end of file diff --git a/Code/ForceField/ANI/CMakeLists.txt b/Code/ForceField/ANI/CMakeLists.txt new file mode 100644 index 00000000000..98345b1ae19 --- /dev/null +++ b/Code/ForceField/ANI/CMakeLists.txt @@ -0,0 +1,7 @@ +if(RDK_HAS_EIGEN) +rdkit_catch_test(ANIForceFieldCatchTest ANIForceField_catch.cpp catch_main.cpp + LINK_LIBRARIES + DistGeomHelpers ForceFieldHelpers + FileParsers MolTransforms SmilesParse + SubstructMatch MolAlign ANIDescriptors ANIForceField) +endif(RDK_HAS_EIGEN) \ No newline at end of file diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/EtaR.bin b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/EtaR.bin new file mode 100644 index 00000000000..64b91d8bdd0 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/EtaR.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfA.bin b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfA.bin new file mode 100644 index 00000000000..a652a3341da Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfA.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfR.bin b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfR.bin new file mode 100644 index 00000000000..d3b17a9151a Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfR.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfZ.bin b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfZ.bin new file mode 100644 index 00000000000..6c2965169d7 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/ShfZ.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/etaA.bin b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/etaA.bin new file mode 100644 index 00000000000..dca22dfa1f2 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/etaA.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/zeta.bin b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/zeta.bin new file mode 100644 index 00000000000..8fcdb3ccfb9 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/zeta.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model0.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model0.bin new file mode 100644 index 00000000000..61e299c4460 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model0.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model1.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model1.bin new file mode 100644 index 00000000000..ad7543d933f Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model1.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model2.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model2.bin new file mode 100644 index 00000000000..24547d19b2c Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model2.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model3.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model3.bin new file mode 100644 index 00000000000..a481c0a2ece Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model3.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model4.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model4.bin new file mode 100644 index 00000000000..aa4b65f9421 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model4.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model5.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model5.bin new file mode 100644 index 00000000000..e04038fc706 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model5.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model6.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model6.bin new file mode 100644 index 00000000000..36eb1a323f4 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model6.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/model7.bin b/Code/ForceField/ANI/Params/ANI-1ccx/model7.bin new file mode 100644 index 00000000000..c57a087ffa3 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1ccx/model7.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1ccx/selfEnergies b/Code/ForceField/ANI/Params/ANI-1ccx/selfEnergies new file mode 100644 index 00000000000..da282b7e2d1 --- /dev/null +++ b/Code/ForceField/ANI/Params/ANI-1ccx/selfEnergies @@ -0,0 +1,4 @@ +H,0=-0.5991501324919538 +C,1=-38.03750806057356 +N,2=-54.67448347695333 +O,3=-75.16043537275567 diff --git a/Code/ForceField/ANI/Params/ANI-1x/AEVParams/EtaR.bin b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/EtaR.bin new file mode 100644 index 00000000000..64b91d8bdd0 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/EtaR.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfA.bin b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfA.bin new file mode 100644 index 00000000000..a652a3341da Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfA.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfR.bin b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfR.bin new file mode 100644 index 00000000000..d3b17a9151a Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfR.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfZ.bin b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfZ.bin new file mode 100644 index 00000000000..6c2965169d7 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/ShfZ.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/AEVParams/etaA.bin b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/etaA.bin new file mode 100644 index 00000000000..dca22dfa1f2 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/etaA.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/AEVParams/zeta.bin b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/zeta.bin new file mode 100644 index 00000000000..8fcdb3ccfb9 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/AEVParams/zeta.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model0.bin b/Code/ForceField/ANI/Params/ANI-1x/model0.bin new file mode 100644 index 00000000000..355624ff989 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model0.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model1.bin b/Code/ForceField/ANI/Params/ANI-1x/model1.bin new file mode 100644 index 00000000000..83648f108a6 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model1.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model2.bin b/Code/ForceField/ANI/Params/ANI-1x/model2.bin new file mode 100644 index 00000000000..109635d775a Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model2.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model3.bin b/Code/ForceField/ANI/Params/ANI-1x/model3.bin new file mode 100644 index 00000000000..61eb4e567f6 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model3.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model4.bin b/Code/ForceField/ANI/Params/ANI-1x/model4.bin new file mode 100644 index 00000000000..6bf3756d295 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model4.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model5.bin b/Code/ForceField/ANI/Params/ANI-1x/model5.bin new file mode 100644 index 00000000000..0c72e871a61 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model5.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model6.bin b/Code/ForceField/ANI/Params/ANI-1x/model6.bin new file mode 100644 index 00000000000..485cd218349 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model6.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/model7.bin b/Code/ForceField/ANI/Params/ANI-1x/model7.bin new file mode 100644 index 00000000000..70aaab94023 Binary files /dev/null and b/Code/ForceField/ANI/Params/ANI-1x/model7.bin differ diff --git a/Code/ForceField/ANI/Params/ANI-1x/selfEnergies b/Code/ForceField/ANI/Params/ANI-1x/selfEnergies new file mode 100644 index 00000000000..31c579af9d3 --- /dev/null +++ b/Code/ForceField/ANI/Params/ANI-1x/selfEnergies @@ -0,0 +1,4 @@ +H,0=-0.600952980000 +C,1=-38.08316124000 +N,2=-54.70775770000 +O,3=-75.19446356000 diff --git a/Code/ForceField/ANI/catch_main.cpp b/Code/ForceField/ANI/catch_main.cpp new file mode 100644 index 00000000000..6f22ebe7e78 --- /dev/null +++ b/Code/ForceField/ANI/catch_main.cpp @@ -0,0 +1,12 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do + // this in one cpp file +#include "catch.hpp" diff --git a/Code/ForceField/CMakeLists.txt b/Code/ForceField/CMakeLists.txt index 082e1af9d53..5021528d60e 100644 --- a/Code/ForceField/CMakeLists.txt +++ b/Code/ForceField/CMakeLists.txt @@ -14,6 +14,12 @@ rdkit_library(ForceField MMFF/Params.cpp LINK_LIBRARIES Optimizer Trajectory) +if(RDK_HAS_EIGEN) +rdkit_library(ANIForceField + ANI/AtomicContrib.cpp + LINK_LIBRARIES Optimizer Trajectory ANIDescriptors EigenSerializer) +endif(RDK_HAS_EIGEN) + rdkit_headers(Contrib.h ForceField.h DEST ForceField) @@ -41,9 +47,15 @@ rdkit_headers(MMFF/AngleBend.h MMFF/TorsionConstraint.h MMFF/PositionConstraint.h MMFF/Params.h DEST ForceField/MMFF) +if(RDK_HAS_EIGEN) +rdkit_headers(ANI/AtomicContrib.h DEST ForceField/ANI) +endif(RDK_HAS_EIGEN) add_subdirectory(UFF) add_subdirectory(MMFF) +if(RDK_HAS_EIGEN) +add_subdirectory(ANI) +endif(RDK_HAS_EIGEN) if(RDK_BUILD_PYTHON_WRAPPERS) add_subdirectory(Wrap) endif() \ No newline at end of file diff --git a/Code/ForceField/Wrap/CMakeLists.txt b/Code/ForceField/Wrap/CMakeLists.txt index 3253778be6b..6813e8f3794 100644 --- a/Code/ForceField/Wrap/CMakeLists.txt +++ b/Code/ForceField/Wrap/CMakeLists.txt @@ -1,5 +1,6 @@ remove_definitions(-DRDKIT_FORCEFIELD_BUILD) rdkit_python_extension(rdForceField ForceField.cpp DEST ForceField - LINK_LIBRARIES ForceFieldHelpers ) + LINK_LIBRARIES ForceFieldHelpers ANIForceField) add_pytest(pyForceFieldConstraints ${CMAKE_CURRENT_SOURCE_DIR}/testConstraints.py) +add_pytest(pyForceFieldANI ${CMAKE_CURRENT_SOURCE_DIR}/testANI.py) diff --git a/Code/ForceField/Wrap/ForceField.cpp b/Code/ForceField/Wrap/ForceField.cpp index dfec7190cc4..e2ce8281634 100644 --- a/Code/ForceField/Wrap/ForceField.cpp +++ b/Code/ForceField/Wrap/ForceField.cpp @@ -22,11 +22,29 @@ #include #include #include +#include #include "PyForceField.h" using namespace ForceFields; namespace python = boost::python; +#ifdef RDK_HAS_EIGEN3 +void ANIAddAtomContrib(PyForceField *self, python::list speciesVec, + int atomType, unsigned int atomIdx, + unsigned int numAtoms, unsigned int numLayers, + unsigned int ensembleSize, std::string modelType) { + ANI::ANIAtomContrib *contrib; + Eigen::VectorXi speciesVector(numAtoms); + for (unsigned int i = 0; i < numAtoms; i++) { + speciesVector(i) = python::extract(speciesVec[i]); + } + contrib = new ANI::ANIAtomContrib(self->field.get(), atomType, atomIdx, + speciesVector, numAtoms, numLayers, + ensembleSize, modelType); + self->field->contribs().push_back(ForceFields::ContribPtr(contrib)); +} +#endif + void ForceFieldAddDistanceConstraint(PyForceField *self, unsigned int idx1, unsigned int idx2, double minLen, double maxLen, double forceConstant) { @@ -129,7 +147,9 @@ double PyForceField::calcEnergyWithPos(const python::object &pos) { size_t s = this->field->dimension() * this->field->numPoints(); size_t numElements = python::extract(pos.attr("__len__")()); if (s != numElements) { - throw ValueErrorException("The Python container must have length equal to Dimension() * NumPoints()"); + throw ValueErrorException( + "The Python container must have length equal to Dimension() * " + "NumPoints()"); } std::vector c(s); for (size_t i = 0; i < s; ++i) { @@ -148,7 +168,7 @@ PyObject *PyForceField::positions() { const RDGeom::PointPtrVect &p = this->field->positions(); size_t i = 0; PyObject *coordItem; - for (const auto pptr: p) { + for (const auto pptr : p) { for (size_t j = 0; j < 3; ++j) { coordItem = PyFloat_FromDouble((*pptr)[j]); PyTuple_SetItem(coordTuple, i++, coordItem); @@ -165,7 +185,9 @@ PyObject *PyForceField::calcGradWithPos(const python::object &pos) { if (pos != python::object()) { size_t numElements = python::extract(pos.attr("__len__")()); if (s != numElements) { - throw ValueErrorException("The Python container must have length equal to Dimension() * NumPoints()"); + throw ValueErrorException( + "The Python container must have length equal to Dimension() * " + "NumPoints()"); } std::vector c(s); for (size_t i = 0; i < s; ++i) { @@ -182,18 +204,19 @@ PyObject *PyForceField::calcGradWithPos(const python::object &pos) { return gradTuple; } -python::tuple PyForceField::minimizeTrajectory(unsigned int snapshotFreq, int maxIts, double forceTol, double energyTol) { +python::tuple PyForceField::minimizeTrajectory(unsigned int snapshotFreq, + int maxIts, double forceTol, + double energyTol) { PRECONDITION(this->field, "no force field"); RDKit::SnapshotVect snapshotVect; - int resInt = this->field->minimize(snapshotFreq, &snapshotVect, - maxIts, forceTol, energyTol); + int resInt = this->field->minimize(snapshotFreq, &snapshotVect, maxIts, + forceTol, energyTol); python::list l; for (RDKit::SnapshotVect::const_iterator it = snapshotVect.begin(); it != snapshotVect.end(); ++it) { l.append(new RDKit::Snapshot(*it)); } return python::make_tuple(resInt, l); - } PyObject *PyMMFFMolProperties::getMMFFBondStretchParams( @@ -302,22 +325,24 @@ BOOST_PYTHON_MODULE(rdForceField) { python::class_("ForceField", "A force field", python::no_init) .def("CalcEnergy", - (double (PyForceField::*)(const python::object &) const) &PyForceField::calcEnergyWithPos, + (double (PyForceField::*)(const python::object &) const) & + PyForceField::calcEnergyWithPos, (python::arg("pos") = python::object()), "Returns the energy (in kcal/mol) of the current arrangement\n" "or of the supplied coordinate list (if non-empty)") .def("CalcGrad", &PyForceField::calcGradWithPos, (python::arg("pos") = python::object()), "Returns a tuple filled with the per-coordinate gradients\n" - "of the current arrangement or of the supplied coordinate list (if non-empty)") + "of the current arrangement or of the supplied coordinate list (if " + "non-empty)") .def("Positions", &PyForceField::positions, "Returns a tuple filled with the coordinates of the\n" "points the ForceField is handling") .def("Dimension", - (unsigned int (PyForceField::*)() const) &PyForceField::dimension, + (unsigned int (PyForceField::*)() const) & PyForceField::dimension, "Returns the dimension of the ForceField") .def("NumPoints", - (unsigned int (PyForceField::*)() const) &PyForceField::numPoints, + (unsigned int (PyForceField::*)() const) & PyForceField::numPoints, "Returns the number of points the ForceField is handling") .def("Minimize", &PyForceField::minimize, (python::arg("maxIts") = 200, python::arg("forceTol") = 1e-4, @@ -329,7 +354,8 @@ BOOST_PYTHON_MODULE(rdForceField) { python::arg("forceTol") = 1e-4, python::arg("energyTol") = 1e-6), "Runs some minimization iterations, recording the minimization " "trajectory every snapshotFreq steps.\n\n" - "Returns a (int, []) tuple; the int is 0 if the minimization succeeded, " + "Returns a (int, []) tuple; the int is 0 if the minimization " + "succeeded, " "while the list contains Snapshot objects.") .def("AddDistanceConstraint", ForceFieldAddDistanceConstraint, (python::arg("self"), python::arg("idx1"), python::arg("idx2"), @@ -402,6 +428,14 @@ BOOST_PYTHON_MODULE(rdForceField) { (python::arg("self"), python::arg("idx"), python::arg("maxDispl"), python::arg("forceConstant")), "Adds a position constraint to the MMFF force field.") +#ifdef RDK_HAS_EIGEN3 + .def("AddANIAtomContrib", ANIAddAtomContrib, + (python::arg("self"), python::arg("speciesVec"), + python::arg("atomType"), python::arg("atomIdx"), + python::arg("numAtoms"), python::arg("numLayers"), + python::arg("ensembleSize"), python::arg("modelType")), + "Adds a atomic contribution according to ANI model Forcefield") +#endif .def("Initialize", &PyForceField::initialize, "initializes the force field (call this before minimizing)") .def("AddExtraPoint", &PyForceField::addExtraPoint, @@ -428,15 +462,18 @@ BOOST_PYTHON_MODULE(rdForceField) { python::arg("idx2")), "Retrieves MMFF bond stretch parameters for atoms with indexes " "idx1, idx2 " - "as a (bondType, kb, r0) tuple, or None if no parameters could be " + "as a (bondType, kb, r0) tuple, or None if no parameters could " + "be " "found") .def("GetMMFFAngleBendParams", &PyMMFFMolProperties::getMMFFAngleBendParams, (python::arg("self"), python::arg("mol"), python::arg("idx1"), python::arg("idx2"), python::arg("idx3")), - "Retrieves MMFF angle bend parameters for atoms with indexes idx1, " + "Retrieves MMFF angle bend parameters for atoms with indexes " + "idx1, " "idx2, idx3 " - "as a (angleType, ka, theta0) tuple, or None if no parameters could " + "as a (angleType, ka, theta0) tuple, or None if no parameters " + "could " "be found") .def("GetMMFFStretchBendParams", &PyMMFFMolProperties::getMMFFStretchBendParams, @@ -456,7 +493,8 @@ BOOST_PYTHON_MODULE(rdForceField) { .def("GetMMFFOopBendParams", &PyMMFFMolProperties::getMMFFOopBendParams, (python::arg("self"), python::arg("mol"), python::arg("idx1"), python::arg("idx2"), python::arg("idx3"), python::arg("idx4")), - "Retrieves MMFF out-of-plane bending force constant for atoms with " + "Retrieves MMFF out-of-plane bending force constant for atoms " + "with " "indexes " "idx1, idx2, idx3, idx4 as a koop float value") .def("GetMMFFVdWParams", &PyMMFFMolProperties::getMMFFVdWParams, @@ -477,11 +515,13 @@ BOOST_PYTHON_MODULE(rdForceField) { "Sets the DielConst MMFF property (defaults to 1.0)") .def("SetMMFFBondTerm", &PyMMFFMolProperties::setMMFFBondTerm, (python::arg("self"), python::arg("state") = true), - "Sets the bond term to be included in the MMFF equation (defaults " + "Sets the bond term to be included in the MMFF equation " + "(defaults " "to True)") .def("SetMMFFAngleTerm", &PyMMFFMolProperties::setMMFFAngleTerm, (python::arg("self"), python::arg("state") = true), - "Sets the angle term to be included in the MMFF equation (defaults " + "Sets the angle term to be included in the MMFF equation " + "(defaults " "to True)") .def("SetMMFFStretchBendTerm", &PyMMFFMolProperties::setMMFFStretchBendTerm, @@ -510,7 +550,8 @@ BOOST_PYTHON_MODULE(rdForceField) { "defaults to \"MMFF94\")") .def("SetMMFFVerbosity", &PyMMFFMolProperties::setMMFFVerbosity, (python::arg("self"), python::arg("verbosity") = 0), - "Sets the MMFF verbosity (0: none; 1: low; 2: high; defaults to 0)"); + "Sets the MMFF verbosity (0: none; 1: low; 2: high; defaults to " + "0)"); } /* (python::arg("self"), python::arg("mol"), python::arg("idx1"), diff --git a/Code/ForceField/Wrap/testANI.py b/Code/ForceField/Wrap/testANI.py new file mode 100644 index 00000000000..e607b86e180 --- /dev/null +++ b/Code/ForceField/Wrap/testANI.py @@ -0,0 +1,26 @@ +from rdkit import RDConfig +import sys, os +from time import sleep +from multiprocessing import Process, Value +import unittest +from rdkit import Chem +from rdkit.Chem import ChemicalForceFields +from rdkit.Chem import rdMolTransforms + +class TestCase(unittest.TestCase): + def testANIForceField(self): + self.dirName = os.path.join(RDConfig.RDBaseDir, 'Code', 'GraphMol', 'ForceFieldHelpers', 'UFF', + 'test_data') + fName = os.path.join(self.dirName, 'CH4.mol') + m = Chem.MolFromMolFile(fName, True, False) + ff = ChemicalForceFields.ANIGetMoleculeForceField(m, "ANI-1ccx", 8) + self.failUnless(ff) + positions = ff.Positions() + savedPos = list(positions) + e1 = ff.CalcEnergy() + ff.AddANIAtomContrib([0, 0, 0, 1, 0], 1, 3, 5, 0, 8, "ANI-1ccx") + e2 = ff.CalcEnergy(savedPos) + self.assertAlmostEqual(38.0375 - abs(e2 - e1), 0.0748, 3) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/Code/GraphMol/Descriptors/AtomicEnvironmentVector.cpp b/Code/GraphMol/Descriptors/AtomicEnvironmentVector.cpp new file mode 100644 index 00000000000..0e0245cfc6b --- /dev/null +++ b/Code/GraphMol/Descriptors/AtomicEnvironmentVector.cpp @@ -0,0 +1,778 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include +#include +#include +#include "AtomicEnvironmentVector.h" +#include + +using namespace Eigen; + +namespace RDKit { +namespace Descriptors { +namespace ANI { +VectorXi GenerateSpeciesVector(const ROMol &mol) { + // Generate atom species vector as mentioned in torchani + // H : 0 + // C : 1 + // N : 2 + // O : 3 + // All other atoms : -1 + auto numAtoms = mol.getNumAtoms(); + VectorXi species(numAtoms); + + for (unsigned int i = 0; i < numAtoms; i++) { + auto atom = mol.getAtomWithIdx(i); + + switch (atom->getAtomicNum()) { + case 1: + species[i] = 0; + break; + case 6: + species[i] = 1; + break; + case 7: + species[i] = 2; + break; + case 8: + species[i] = 3; + break; + default: + throw ValueErrorException("Atom Type Not Supported"); + } + } + + return species; +} + +VectorXi GenerateSpeciesVector(const int *atomNums, unsigned int numAtoms) { + PRECONDITION(atomNums != nullptr, "Array of atom types is NULL") + VectorXi species(numAtoms); + + for (unsigned int i = 0; i < numAtoms; i++) { + switch (atomNums[i]) { + case 1: + species[i] = 0; + break; + case 6: + species[i] = 1; + break; + case 7: + species[i] = 2; + break; + case 8: + species[i] = 3; + break; + default: + throw ValueErrorException("Atom Type Not Supported"); + } + } + + return species; +} + +void NeighborPairs(ArrayXXd *coordinates, const VectorXi *species, + double cutoff, unsigned int numAtoms, ArrayXi *atomIndex12) { + PRECONDITION(coordinates != nullptr, "Coordinates are NULL"); + PRECONDITION(species != nullptr, "species vector is NULL"); + PRECONDITION(coordinates->rows() == numAtoms, + "Number of coordinate vectors must be same as number of atoms"); + PRECONDITION(species->size() == numAtoms, + "Size of species vector must be same as number of atoms"); + + // Find atoms which are not H, C, N or O + auto paddingMask = species->array() == -1; + unsigned int cols = 0; + auto numPairs = numAtoms * (numAtoms - 1) / 2; + + // Each column contains pair of indices of the upper + // traingular matrix of size numAtoms + MatrixXi upperTriag(2, numPairs); + for (unsigned int i = 0; i < numAtoms; i++) { + for (unsigned int j = i + 1; j < numAtoms; j++) { + upperTriag.col(cols) << i, j; + cols++; + } + } + + // Flattened previously mentioned matrix with indices + // Example : (0, 0, 1) -> (0, 0, 1, 1, 2, 2) + // (1, 2, 2) + ArrayXi upperTriagFlattened(numPairs * 2); + unsigned int index = 0; + for (auto i = 0; i < upperTriag.rows(); i++) { + for (auto j = 0; j < upperTriag.cols(); j++) { + upperTriagFlattened(index) = upperTriag(i, j); + index++; + } + } + + // Select indices in upperTriagFlattened from coordinates + ArrayXXd pairCoordinates(numPairs * 2, 3); + IndexSelect(&pairCoordinates, coordinates, upperTriagFlattened, 0); + + // Find vector and distances between each pair of atoms + ArrayXXd distances(numPairs, 3); + for (unsigned int i = 0; i < numPairs; i++) { + distances.row(i) = + pairCoordinates.row(i) - pairCoordinates.row(i + numPairs); + } + + auto distanceNorm = distances.matrix().rowwise().norm().array(); + + // Create Mask for atoms which are not H, C, N or O + // In the mask 0 if atom is H, C, N or O and 1 otherwise + ArrayXXi pairPaddedMask(numPairs * 2, 1); + for (auto i = 0; i < upperTriagFlattened.size(); i++) { + pairPaddedMask(i, 0) = paddingMask(upperTriagFlattened(i), 0); + } + + ArrayXd dist(distanceNorm.size()); + + // Wherever mask is 1, set distance as infinity + for (auto i = 0; i < distanceNorm.size(); i++) { + if (pairPaddedMask(i, 0) == 1) { + dist(i) = INFINITY; + } else { + dist(i) = distanceNorm(i); + } + } + + auto x = dist.array() <= cutoff; + + // Store atom pairs distance between which is less than cutoff + std::vector indices; + std::vector> atomIndex12_vec; + + for (auto i = 0; i < x.size(); i++) { + if (x(i) == 1) { + atomIndex12_vec.push_back( + std::make_pair(upperTriag(0, i), upperTriag(1, i))); + } + } + + ArrayXi atomIndex12Array(atomIndex12_vec.size() * 2); + atomIndex12->resize(atomIndex12_vec.size() * 2); + index = 0; + for (auto i : atomIndex12_vec) { + (*atomIndex12)(index) = i.first; + index++; + } + for (auto i : atomIndex12_vec) { + (*atomIndex12)(index) = i.second; + index++; + } +} + +//! Computes radial terms of the torchANI style atom features +/*! + \param cutoff Maximum distance between 2 atoms to show if they contribute + to each other's environments + \param distances Distances between pairs of + atoms which are in each other's neighbourhoods + \return Radial terms according + to each pair of distances in the molecule calculated using hard coded + parameters +*/ +template +void RadialTerms(double cutoff, ArrayBase &distances, + ArrayXXd &RadialTerms_, + const std::map *params) { + // Find cutoff factor for each pair of atoms which lie in each other's + // neghborhoods + // All the constants were determined in torchANI and have been taken from + // there + auto fc = CosineCutoff(&distances, cutoff); + ArrayXd EtaR = params->find("EtaR")->second; + ArrayXd ShfR = params->find("ShfR")->second; + + RadialTerms_.resize(distances.rows(), ShfR.size() * EtaR.size()); + + for (auto i = 0; i < distances.rows(); i++) { + ArrayXXd calculatedRowVector(1, ShfR.size() * EtaR.size()); + unsigned int idx = 0; + for (auto etaIdx = 0; etaIdx < EtaR.size(); etaIdx++) { + auto intermediate = + 0.25 * ((ShfR - distances(i)).pow(2) * EtaR(etaIdx) * -1).exp() * + fc(i); + for (unsigned int j = 0; j < intermediate.size(); j++) { + calculatedRowVector(0, idx + j) = intermediate(j); + } + idx += ShfR.size(); + } + RadialTerms_.row(i) = calculatedRowVector; + } +} + +//! Computes angular terms of the torchANI style atom features +/*! + \param cutoff Maximum distance between 2 atoms to show if they contribute + to each other's environments + \param vector12 Pairs of vectors generated by a + triplet of 3 atoms which are in each other's neighbourhoods + \return Angular + terms according to each pair of distances in the molecule calculated using + hard coded parameters +*/ +template +void AngularTerms(double cutoff, ArrayBase &vectors12, + ArrayXXd &AngularTerms_, + const std::map *params) { + // All the constants were determined in torchANI and have been taken from + // there + // Angle wise shift in the trigonometric term of the angular symmetry function + ArrayXd ShfZ = params->find("ShfZ")->second; + ArrayXd ShfA = params->find("ShfA")->second; + ArrayXd zeta = params->find("zeta")->second; + ArrayXd etaA = params->find("etaA")->second; + + auto distances12 = vectors12.matrix().rowwise().norm().array(); + + // Each triplet gives one angle formed by 2 vectors. The angle is found by + // taking dot product of the 2 vectors + ArrayXXd cosineAngles(vectors12.rows() / 2, 1); + for (auto i = 0; i < vectors12.rows() / 2; i++) { + auto dotProduct = vectors12.matrix().row(i).dot( + vectors12.matrix().row(i + vectors12.rows() / 2)); + auto vector1Norm = vectors12.matrix().row(i).norm(); + auto vector2Norm = vectors12.matrix().row(i + vectors12.rows() / 2).norm(); + if (vector1Norm == 0 || vector2Norm == 0) { + throw ValueErrorException("2 Atoms have the same position vector"); + } + cosineAngles(i, 0) = 0.95 * dotProduct / (vector1Norm * vector2Norm); + } + auto angles = cosineAngles.acos(); + auto fcj12 = CosineCutoff(&distances12, cutoff); + + // Angle dependent factors for the angular symmetry functions + ArrayXXd factor1(angles.rows(), ShfZ.size() * zeta.size()); + for (auto i = 0; i < angles.rows(); i++) { + ArrayXXd calculatedRowVector(1, ShfZ.size() * zeta.size()); + unsigned int idx = 0; + for (auto zetaIdx = 0; zetaIdx < zeta.size(); zetaIdx++) { + ArrayXXd intermediate(1, ShfZ.size()); + intermediate + << (((-1 * (ShfZ.rowwise() - angles.row(i)).array()).cos().array() + + 1) + .array() / + 2) + .array() + .pow(zeta(zetaIdx)) + .array(); + for (unsigned int j = 0; j < intermediate.size(); j++) { + calculatedRowVector(0, j + idx) = intermediate(j); + } + idx += ShfZ.size(); + } + factor1.row(i) = calculatedRowVector; + } + + // Distance dependent factors for the angular symmetry functions from both + // vectors given by the triplet + ArrayXXd distance12sum(distances12.rows() / 2, 1); + + for (auto i = 0; i < distances12.rows() / 2; i++) { + distance12sum(i, 0) = + distances12(i, 0) + distances12(i + distances12.rows() / 2, 0); + } + + ArrayXXd factor2(distance12sum.rows(), ShfA.size() * etaA.size()); + for (auto i = 0; i < distance12sum.rows(); i++) { + unsigned int idx = 0; + ArrayXXd calculatedRowVector(1, ShfA.size() * etaA.size()); + for (auto etaAidx = 0; etaAidx < etaA.size(); etaAidx++) { + ArrayXXd intermediate(1, ShfA.size()); + intermediate << ((ShfA.rowwise() - (distance12sum.array() / 2).row(i)) + .pow(2) + .array() * + -etaA(etaAidx)) + .exp(); + for (auto j = 0; j < intermediate.size(); j++) { + calculatedRowVector(idx + j) = intermediate(j); + } + idx += ShfA.size(); + } + factor2.row(i) = calculatedRowVector; + } + + // cutoff terms from both vectors of the triplet + ArrayXXd fcj12prod(fcj12.rows() / 2, 1); + for (auto i = 0; i < fcj12.rows() / 2; i++) { + fcj12prod(i, 0) = fcj12(i, 0) * fcj12(i + fcj12.rows() / 2, 0); + } + + AngularTerms_.resize(fcj12prod.rows(), 32); + for (auto i = 0; i < AngularTerms_.rows(); i++) { + unsigned int idx = 0; + for (auto j = 0; j < 4; j++) { + for (auto k = 0; k < 8; k++) { + AngularTerms_(i, idx) = + 2 * factor1(i, k) * factor2(i, j) * fcj12prod(i, 0); + idx++; + } + } + } +} + +void cumsum(std::vector count, bool fromZero, + std::vector *cumsumCount) { + PRECONDITION(cumsumCount != nullptr, "Cumulative sum count array is null"); + if (fromZero == true) { + cumsumCount->push_back(0); + } else { + cumsumCount->push_back(count[0]); + } + unsigned int index = 1; + for (size_t i = 0 + (unsigned int)(!fromZero); i < count.size() - 1; i++) { + cumsumCount->push_back((*cumsumCount)[index - 1] + count[i]); + index++; + } +} + +//! Calculates triplets of atoms according to pairs of atoms close to each other +/*! + \param atomIndex12Angular Pairs of atoms close to each other according to + defined cutoff + \param tripletInfo pair of a vector containing indices of centrals + atoms and Matrix containing pairs of their neighbours + + \return pair of a vector containing indices of centrals atoms and Matrix + containing pairs of their neighbours + + \verbatim + Input: indices for pairs of atoms that are close to each other. + each pair only appear once, i.e. only one of the pairs (1, 2) and + (2, 1) exists. + + Output: indices for all central atoms and it pairs of neighbors. For + example, if input has pair (0, 1), (0, 2), (0, 3), (0, 4), (1, 2), + (1, 3), (1, 4), (2, 3), (2, 4), (3, 4), then the output would have + central atom 0, 1, 2, 3, 4 and for cental atom 0, its pairs of neighbors + are (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4) + \endverbatim +*/ +void TripleByMolecules(ArrayXXi *atomIndex12Angular, + std::pair, ArrayXXi> *tripletInfo) { + // atomIndex12Angular is flattened and sorted and we keep track of initial + // indices so that actual pairs can be calculated back later + PRECONDITION(atomIndex12Angular != nullptr, "Array of atom pairs is NULL"); + PRECONDITION(tripletInfo != nullptr, "Output variable is NULL"); + std::vector> atomIndex12AngularFlattened; + auto index = 0; + for (auto i = 0; i < atomIndex12Angular->rows(); i++) { + for (auto j = 0; j < atomIndex12Angular->cols(); j++) { + atomIndex12AngularFlattened.push_back( + std::make_pair((*atomIndex12Angular)(i, j), index)); + index++; + } + } + std::stable_sort(atomIndex12AngularFlattened.begin(), + atomIndex12AngularFlattened.end()); + std::vector revIndices, sortedAi; + for (auto i : atomIndex12AngularFlattened) { + revIndices.push_back(i.second); + sortedAi.push_back(i.first); + } + + // Find unique keys + std::vector uniqueResults(sortedAi.size()); + + auto ip = + std::unique_copy(sortedAi.begin(), sortedAi.end(), uniqueResults.begin()); + uniqueResults.resize(std::distance(uniqueResults.begin(), ip)); + + // Number of occurrences of each unique key + std::vector counts(uniqueResults.size()), + pairSizes(uniqueResults.size()); + for (size_t i = 0; i < uniqueResults.size(); i++) { + counts[i] = std::count(sortedAi.begin(), sortedAi.end(), uniqueResults[i]); + pairSizes[i] = counts[i] * (counts[i] - 1) / 2; + } + // Compute vector of central atom indices + std::vector pairIndices; + + for (size_t i = 0; i < pairSizes.size(); i++) { + auto j = pairSizes[i]; + while (j--) { + pairIndices.push_back(i); + } + } + + for (size_t i = 0; i < pairIndices.size(); i++) { + tripletInfo->first.push_back(uniqueResults[pairIndices[i]]); + } + + // do local combinations within unique key, assuming sorted + int m; + if (counts.size() > 0) { + m = *std::max_element(counts.begin(), counts.end()); + } else { + m = 0; + } + + auto n = pairSizes.size(); + ArrayXXi lowerTriang(2, m * (m - 1) / 2); + ArrayXXi intraPairIndices(2 * n, m * (m - 1) / 2); + index = 0; + + for (auto i = 1; i < m; i++) { + for (auto j = 0; j < i; j++) { + lowerTriang.col(index) << i, j; + index++; + } + } + index = 0; + for (auto i = 0; i < lowerTriang.rows(); i++) { + auto j = n; + while (j--) { + intraPairIndices.row(index) << lowerTriang.row(i); + index++; + } + } + + ArrayXXi mask(1, pairSizes.size() * lowerTriang.cols()); + index = 0; + for (size_t i = 0; i < pairSizes.size(); i++) { + for (auto j = 0; j < lowerTriang.cols(); j++) { + mask(0, index) = pairSizes[i] > j; + index++; + } + } + + ArrayXXi intraPairIndicesFlattened(2, n * m * (m - 1) / 2); + if (intraPairIndices.rows() != 0 && intraPairIndices.cols() != 0) { + index = 0; + for (auto i = 0; i < intraPairIndices.rows() / 2; i++) { + for (auto j = 0; j < m * (m - 1) / 2; j++) { + intraPairIndicesFlattened(0, index + j) = intraPairIndices(i, j); + } + index += (m * (m - 1) / 2); + } + index = 0; + + for (auto i = intraPairIndices.rows() / 2; i < intraPairIndices.rows(); + i++) { + for (auto j = 0; j < m * (m - 1) / 2; j++) { + intraPairIndicesFlattened(1, index + j) = intraPairIndices(i, j); + } + index += (m * (m - 1) / 2); + } + } + ArrayXXi sortedLocalIndex12(2, (mask.array() == 1).count()); + index = 0; + for (auto i = 0; i < mask.size(); i++) { + if (mask(0, i) == 1) { + sortedLocalIndex12.col(index) << intraPairIndicesFlattened.col(i); + index++; + } + } + std::vector cumsumCount; + cumsum(counts, true, &cumsumCount); + + VectorXi extraLocalIndex12(pairIndices.size()); + index = 0; + for (auto i : pairIndices) { + extraLocalIndex12(index) = cumsumCount[i]; + index++; + } + + sortedLocalIndex12 = + (sortedLocalIndex12.matrix().rowwise() + extraLocalIndex12.transpose()) + .array(); + + // unsort from last part + ArrayXXi localIndex12(2, sortedLocalIndex12.cols()); + tripletInfo->second.resize(2, sortedLocalIndex12.cols()); + for (auto j = 0; j < sortedLocalIndex12.cols(); j++) { + tripletInfo->second(0, j) = revIndices[sortedLocalIndex12(0, j)]; + tripletInfo->second(1, j) = revIndices[sortedLocalIndex12(1, j)]; + } +} + +void TriuIndex(unsigned int numSpecies, ArrayXXi &triuIndices) { + std::vector species1, species2, pairIndex; + + for (unsigned int i = 0; i < numSpecies; i++) { + for (unsigned int j = i; j < numSpecies; j++) { + species1.push_back(i); + species2.push_back(j); + } + pairIndex.push_back(i); + } + triuIndices.resize(numSpecies, numSpecies); + ArrayXXi ret(numSpecies, numSpecies); + unsigned int index1 = 0; + + for (size_t i = 0; i < species1.size(); i++) { + triuIndices(species1[i], species2[i]) = index1; + triuIndices(species2[i], species1[i]) = index1; + index1++; + } +} + +//! Accumulate the elements of a Matrix into another Matrix by adding to the +//! indices in the order given in index. +/*! + \param vector1 Matrix to which values are to be added + \param vector2 Matrix from which values are to be added + \param index Indices in order of which values are added + \param multi Number of pairs to be considered + \param numAtoms Number of atoms in the molecules + + \return Matrix containing accumulated elements of vector2 into vector1 + according to order given in index + + \verbatim + Index[i] == j, then the ith row of vector2 is added to the jth row of + vector1 + \endverbatim +*/ +template +void IndexAdd(ArrayXXd &vector1, ArrayXXd &vector2, ArrayBase &index, + unsigned int multi, unsigned int numAtoms) { + PRECONDITION(vector1.rows() == multi * numAtoms, "Too few rows in vector1"); + PRECONDITION(vector2.rows() == index.rows(), "Too few rows in vector2"); + for (auto idxCol = 0; idxCol < index.cols(); idxCol++) { + for (auto i = 0; i < index.rows(); i++) { + for (unsigned int j = 0; j < multi * numAtoms; j++) { + if (index(i, idxCol) == (int)j) { + vector1.row(j) += vector2.row(i); + } + } + } + } + // return vector1; +} + +ArrayXXd AtomicEnvironmentVector( + double *pos, const VectorXi &species, unsigned int numAtoms, + const std::map *params) { + PRECONDITION(species.size() == numAtoms, + "Species encoding for each atom is required"); + PRECONDITION(pos != nullptr, "Array of positions is NULL"); + ArrayXXd coordinates(numAtoms, 3); + for (unsigned int i = 0; i < numAtoms; i++) { + coordinates.row(i) << pos[3 * i], pos[3 * i + 1], pos[3 * i + 2]; + } + // Fetch pairs of atoms which are neigbours which lie within the cutoff + // distance 5.2 Angstroms. The constant was obtained by authors of torchANI + ArrayXi atomIndex12; + NeighborPairs(&coordinates, &species, 5.2, numAtoms, &atomIndex12); + ArrayXXd selectedCoordinates(atomIndex12.rows(), 3); + IndexSelect(&selectedCoordinates, &coordinates, atomIndex12, 0); + + // Vectors between pairs of atoms that lie in each other's neighborhoods + unsigned int numPairs = selectedCoordinates.rows() / 2; + ArrayXXd vec(numPairs, 3); + for (unsigned int i = 0; i < numPairs; i++) { + vec.row(i) = + selectedCoordinates.row(i) - selectedCoordinates.row(i + numPairs); + } + + auto distances = vec.matrix().rowwise().norm().array(); + ArrayXXi species12(2, numPairs); + ArrayXXi species12Flipped(2, numPairs); + ArrayXXi atomIndex12Unflattened(2, numPairs); + for (unsigned int i = 0; i < numPairs; i++) { + species12(0, i) = species(atomIndex12(i)); + species12(1, i) = species(atomIndex12(i + numPairs)); + + species12Flipped(1, i) = species(atomIndex12(i)); + species12Flipped(0, i) = species(atomIndex12(i + numPairs)); + + atomIndex12Unflattened(0, i) = atomIndex12(i); + atomIndex12Unflattened(1, i) = atomIndex12(i + numPairs); + } + + // Obtain indices to use for constructing final radial aev + // The constant 4 comes from the fact that each atom will have 4 kinds of + // interactions. For Example, for H it is HC, HO, HN and HX where X is any + // other atom + auto index12 = (atomIndex12Unflattened * 4 + species12Flipped).transpose(); + ArrayXXd RadialTerms_; + RadialTerms(5.2, distances, RadialTerms_, params); + ArrayXXd radialAEV = ArrayXXd::Zero(4 * numAtoms, 16); + IndexAdd(radialAEV, RadialTerms_, index12, 4, numAtoms); + + // Each atom finally has a total of 64 radial terms + ArrayXXd finalRadialAEV(numAtoms, 64); + unsigned int atomIdx = 0; + for (auto i = 0; i < radialAEV.rows(); i += 4) { + finalRadialAEV.row(atomIdx) << radialAEV.row(i), radialAEV.row(i + 1), + radialAEV.row(i + 2), radialAEV.row(i + 3); + atomIdx++; + } + + // Distance cutoff for angular terms is smaller than for radial terms, so we + // construct a smaller neighbor list. The authors of torchANI found that the + // cutoff 3.5 gave best results + ArrayXi evenCloserIndices((distances.array() <= 3.5).count()); + unsigned int idx = 0; + for (auto i = 0; i < distances.size(); i++) { + if (distances(i) <= 3.5) { + evenCloserIndices(idx) = i; + idx++; + } + } + + // Angular Terms + // Construct all the previously mentioned neighbor pair information for the + // smaller neighbor list + ArrayXXi species12Angular(2, evenCloserIndices.size()); + ArrayXXi atomIndex12Angular(2, evenCloserIndices.size()); + + ArrayXXd vecAngular(evenCloserIndices.size(), 3); + + IndexSelect(&species12Angular, &species12, evenCloserIndices, 1); + IndexSelect(&atomIndex12Angular, &atomIndex12Unflattened, evenCloserIndices, + 1); + IndexSelect(&vecAngular, &vec, evenCloserIndices, 0); + + auto n = evenCloserIndices.size(); + + // Find Triplets for which angular terms are to be found + // TripleByMolecules returns an array of central atoms and the corresponding + // pair of atoms in an STL pair + std::pair, ArrayXXi> tripletInfo; + TripleByMolecules(&atomIndex12Angular, &tripletInfo); + auto pairIndex12 = tripletInfo.second; + auto centralAtomIndex = tripletInfo.first; + ArrayXXi sign12(2, pairIndex12.cols()); + + // compute mapping between representation of central-other to pair + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + if (pairIndex12(i, j) < n) { + sign12(i, j) = 1; + } else { + sign12(i, j) = -1; + } + } + } + + n = atomIndex12Angular.cols(); + + // pairIndex12 = pairindex12 % n + auto localIndex = pairIndex12.cast(); + + pairIndex12 = + (localIndex.array() - (localIndex.array() / n).array() * n).array(); + + ArrayXi pairIndex12Flattened(2 * pairIndex12.cols()); + idx = 0; + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + pairIndex12Flattened(idx) = pairIndex12(i, j); + idx++; + } + } + + ArrayXXd vecFlattened(pairIndex12Flattened.size(), 3); + IndexSelect(&vecFlattened, &vecAngular, pairIndex12Flattened, 0); + + ArrayXXd vec12(vecFlattened.rows(), 3); + for (auto i = 0; i < vecFlattened.rows() / 2; i++) { + vec12.row(i) = vecFlattened.row(i) * sign12(0, i); + } + + for (auto i = vecFlattened.rows() / 2; i < vecFlattened.rows(); i++) { + vec12.row(i) = vecFlattened.row(i) * sign12(1, i - vecFlattened.rows() / 2); + } + ArrayXXd AngularTerms_; + AngularTerms(3.5, vec12, AngularTerms_, params); + + ArrayXXi centralAtomIndexArr(centralAtomIndex.size(), 1); + + for (size_t i = 0; i < centralAtomIndex.size(); i++) { + centralAtomIndexArr.row(i) << centralAtomIndex[i]; + } + + ArrayXXi species12Small1(2, pairIndex12.cols()); + ArrayXXi species12Small2(2, pairIndex12.cols()); + + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + species12Small1(i, j) = species12Angular(0, pairIndex12(i, j)); + } + } + + for (auto i = 0; i < pairIndex12.rows(); i++) { + for (auto j = 0; j < pairIndex12.cols(); j++) { + species12Small2(i, j) = species12Angular(1, pairIndex12(i, j)); + } + } + + ArrayXXi species12_(sign12.rows(), sign12.cols()); + + for (auto i = 0; i < sign12.rows(); i++) { + for (auto j = 0; j < sign12.cols(); j++) { + if (sign12(i, j) == 1) { + species12_(i, j) = species12Small2(i, j); + } else { + species12_(i, j) = species12Small1(i, j); + } + } + } + + ArrayXXi index(species12_.cols(), 1); + ArrayXXi triuIndices; + TriuIndex(4, triuIndices); + + for (auto i = 0; i < species12_.cols(); i++) { + index.row(i) = triuIndices(species12_(0, i), species12_(1, i)); + } + // The constant 10 comes from 10 pairs that can be formed + index = index + (centralAtomIndexArr.array() * 10).array(); + + ArrayXXd angularAEV = ArrayXXd::Zero(10 * numAtoms, 32); + IndexAdd(angularAEV, AngularTerms_, index, 10, numAtoms); + + ArrayXXd finalAngularAEV(numAtoms, 320); + atomIdx = 0; + for (auto i = 0; i < angularAEV.rows(); i += 10) { + finalAngularAEV.row(atomIdx) << angularAEV.row(i), angularAEV.row(i + 1), + angularAEV.row(i + 2), angularAEV.row(i + 3), angularAEV.row(i + 4), + angularAEV.row(i + 5), angularAEV.row(i + 6), angularAEV.row(i + 7), + angularAEV.row(i + 8), angularAEV.row(i + 9); + atomIdx++; + } + + ArrayXXd finalAEV(finalRadialAEV.rows(), + finalRadialAEV.cols() + finalAngularAEV.cols()); + finalAEV << finalRadialAEV, finalAngularAEV; + + return finalAEV; +} + +ArrayXXd AtomicEnvironmentVector( + const ROMol &mol, const std::map *params, + int confId) { + PRECONDITION(mol.getNumConformers() >= 1, "molecule has no conformers"); + + auto numAtoms = mol.getNumAtoms(); + + const auto conf = mol.getConformer(confId); + + ArrayXXd coordinates(numAtoms, 3); + auto species = GenerateSpeciesVector(mol); + double *pos; + pos = new double[3 * numAtoms]; + for (unsigned int i = 0; i < numAtoms; i++) { + auto atom = conf.getAtomPos(i); + pos[3 * i] = atom.x; + pos[3 * i + 1] = atom.y; + pos[3 * i + 2] = atom.z; + } + + return AtomicEnvironmentVector(pos, species, numAtoms, params); +} +} // namespace ANI +} // namespace Descriptors +} // namespace RDKit diff --git a/Code/GraphMol/Descriptors/AtomicEnvironmentVector.h b/Code/GraphMol/Descriptors/AtomicEnvironmentVector.h new file mode 100644 index 00000000000..0eeacbb5b9c --- /dev/null +++ b/Code/GraphMol/Descriptors/AtomicEnvironmentVector.h @@ -0,0 +1,149 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#ifndef AtomicEnvironmentVectorRDKIT_H_JUNE2020 +#define AtomicEnvironmentVectorRDKIT_H_JUNE2020 +#ifdef RDK_HAS_EIGEN3 + +#ifdef RDK_BUILD_DESCRIPTORS3D +#include +namespace RDKit { +class ROMol; +namespace Descriptors { +namespace ANI { +const std::string AtomicEnvironmentVectorVersion = "1.0.0"; + +RDKIT_DESCRIPTORS_EXPORT void TriuIndex(unsigned int numSpecies, Eigen::ArrayXXi &triuIndices); + +//! Calculates the value a continuous smoothening function for a distance such +//! that values +// greater than the cutoff give 0 +/*! + \param distances A 2 dimensional array of pairwise distances + \param cutoff A double value signifying cutoff distance + + \return 2 dimensional array containing corresponding values computed by cutoff + function +*/ +template +RDKIT_DESCRIPTORS_EXPORT Eigen::ArrayXXd CosineCutoff( + Eigen::ArrayBase *distances, double cutoff) { + // Cosine cutoff function assuming all distances are less than the cutoff + PRECONDITION(cutoff > 0.0, "Cutoff must be greater than zero"); + PRECONDITION(((*distances) <= cutoff).count() == distances->size(), + "All distances must be less than the cutoff"); + PRECONDITION(distances != nullptr, "Array of distances is NULL"); + return 0.5 * ((*distances) * (M_PI / cutoff)).cos() + 0.5; +} + +RDKIT_DESCRIPTORS_EXPORT void TripleByMolecules( + Eigen::ArrayXXi *atomIndex12Angular, + std::pair, Eigen::ArrayXXi> *tripletInfo); + +//------------------------------------------------------- +//! Generates a vector from the molecule containing encoding of each atom +// such that H -> 0, C -> 1, N -> 2, O -> 3 and all other atoms -> -1 +/*! + \param mol A mol object + + \return Vector containing encoding of atoms in the molecule +*/ +RDKIT_DESCRIPTORS_EXPORT Eigen::VectorXi GenerateSpeciesVector( + const ROMol &mol); + +RDKIT_DESCRIPTORS_EXPORT Eigen::VectorXi GenerateSpeciesVector( + const int *atomNums, unsigned int numAtoms); + +//! Computes pairs of atoms that are neighbors bypassing duplication to make +//! calculation faster +/*! + \param coordinates A matrix of size atoms * 3 containing coordinates of each + atom + \param species A vector of size atoms containing mapping from atom + index to encoding + \param cutoff Maximum distance within which 2 atoms + are considered to be neighbours + \param atomIndex12 Array in which each column represents pairs of atoms + + \return 2 dimensional array with 2 rows with each column corresponding to a + pair of atoms which are neighbours +*/ +RDKIT_DESCRIPTORS_EXPORT void NeighborPairs(Eigen::ArrayXXd *coordinates, + const Eigen::VectorXi *species, + double cutoff, + unsigned int numAtoms, + Eigen::ArrayXi *atomIndex12); + +//! Calculates torchANI style symmetry functions combining both radial and +//! angular terms +/*! + \param mol Mol object for which symmetry functions are to be found + \param confId Conformer ID for the conformer for which symmetry + functions are to be found + + \return numAtoms * 384 shaped matrix containing 384 features for every + atom in the input mol consisting of both radial and angular terms +*/ +RDKIT_DESCRIPTORS_EXPORT Eigen::ArrayXXd AtomicEnvironmentVector( + const ROMol &mol, const std::map *params, + int confId = -1); + +//! Calculates torchANI style symmetry functions combining both radial and +//! angular terms +/*! + \param pos Array of positions of atoms + \param species Encoding of atom types with index + \param numAtoms Number of Atoms + + \return numAtoms * 384 shaped matrix containing 384 features for every atom in + the input mol consisting of both radial and angular terms +*/ +RDKIT_DESCRIPTORS_EXPORT Eigen::ArrayXXd AtomicEnvironmentVector( + double *pos, const Eigen::VectorXi &species, unsigned int numAtoms, + const std::map *params); + +//! Constructs a vector with values of another vector at specified indices along +//! given dimension +/*! + \param vector1 Matrix in which values are to be stored + \param vector2 Matrix from which values are to be taken + \param index Array which specifies indices of vector2 + \param dim dimension along which indices are to be picked + + \return Matrix containing values at positions specified by index in vector2 +*/ +template +RDKIT_DESCRIPTORS_EXPORT void IndexSelect(Eigen::ArrayBase *vector1, + Eigen::ArrayBase *vector2, + Eigen::ArrayXi &index, + unsigned int dim) { + PRECONDITION(vector1 != nullptr && vector2 != nullptr, + "Input vectors are NULL"); + PRECONDITION(dim == 0 || dim == 1, + "Only values 0 and 1 are accepted for dim"); + for (auto i = 0; i < index.size(); i++) { + switch (dim) { + case 0: + vector1->row(i) = vector2->row(index(i)); + break; + case 1: + vector1->col(i) = vector2->col(index(i)); + break; + default: + throw ValueErrorException("Value of dim must be 0 or 1"); + } + } +} + +} // namespace ANI +} // namespace Descriptors +} // namespace RDKit +#endif +#endif +#endif diff --git a/Code/GraphMol/Descriptors/AtomicEnvironmentVector_catch.cpp b/Code/GraphMol/Descriptors/AtomicEnvironmentVector_catch.cpp new file mode 100644 index 00000000000..2d520fff598 --- /dev/null +++ b/Code/GraphMol/Descriptors/AtomicEnvironmentVector_catch.cpp @@ -0,0 +1,294 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include "RDGeneral/test.h" +#include "catch.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Eigen; + +std::vector tokenize(const std::string &s) { + boost::char_separator sep(", \n\r\t"); + boost::tokenizer> tok(s, sep); + std::vector tokens; + std::copy(tok.begin(), tok.end(), + std::back_inserter>(tokens)); + return tokens; +} + +std::vector> EigenMatToSTLVector(ArrayXXd aev) { + std::vector> aevOutput; + for (auto i = 0; i < aev.rows(); i++) { + std::vector row; + for (auto j = 0; j < aev.cols(); j++) { + row.push_back(aev(i, j)); + } + aevOutput.push_back(row); + } + return aevOutput; +} + +TEST_CASE("Symmetry Function Accuracy", "[Symmetry Function]") { + std::map params; + std::string path = getenv("RDBASE"); + std::string paramFilePath = + path + "/Code/ForceField/ANI/Params/ANI-1ccx/AEVParams/"; + + // Weights for the radial symmetry functions + ArrayXd ShfR; + RDNumeric::EigenSerializer::deserialize(ShfR, paramFilePath + "ShfR.bin"); + // Variance terms for the gaussian symmetry functions + ArrayXd EtaR; + RDNumeric::EigenSerializer::deserialize(EtaR, paramFilePath + "EtaR.bin"); + + // Weights for the angular symmetry functions + ArrayXd ShfZ; + RDNumeric::EigenSerializer::deserialize(ShfZ, paramFilePath + "ShfZ.bin"); + ArrayXd ShfA; + RDNumeric::EigenSerializer::deserialize(ShfA, paramFilePath + "ShfA.bin"); + // distance wise shifts in the distance term of the angular symmetry function + + ArrayXd zeta; + RDNumeric::EigenSerializer::deserialize(zeta, paramFilePath + "zeta.bin"); + ArrayXd etaA; + RDNumeric::EigenSerializer::deserialize(etaA, paramFilePath + "etaA.bin"); + + params.insert(std::make_pair("ShfR", ShfR)); + params.insert(std::make_pair("EtaR", EtaR)); + params.insert(std::make_pair("ShfZ", ShfZ)); + params.insert(std::make_pair("ShfA", ShfA)); + params.insert(std::make_pair("zeta", zeta)); + params.insert(std::make_pair("etaA", etaA)); + SECTION("CH4") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/CH4.mol"; + + std::string fNameSF = + pathName + "/Code/GraphMol/Descriptors/test_data/CH4.out"; + + std::ifstream instrmSF; + instrmSF.open(fNameSF); + + std::string line; + std::vector tokens; + std::vector> expectedOutput; + + while (!instrmSF.eof()) { + std::getline(instrmSF, line); + tokens = tokenize(line); + std::vector row; + for (auto v : tokens) { + std::istringstream os(v); + double d; + os >> d; + row.push_back(d); + } + expectedOutput.push_back(row); + } + // Each row of the received vector is sorted because in angular terms + // order of triplets may change because of unstable sorting + // To check if the values of the terms are consistent each row of the output + // is sorted + + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + int confId = -1; + + auto aev = RDKit::Descriptors::ANI::AtomicEnvironmentVector(*mol, ¶ms, confId); + + CHECK(aev.rows() == mol->getNumAtoms()); + CHECK(aev.cols() == 384); + + auto aevOutput = EigenMatToSTLVector(aev); + + for (unsigned int i = 0; i < expectedOutput.size(); i++) { + for (unsigned int j = 0; j < expectedOutput[i].size(); j++) { + auto diff = std::fabs(expectedOutput[i][j] - aevOutput[i][j]); + CHECK(diff < 0.2); + } + } + } + + SECTION("NH3") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/NH3.mol"; + + std::string fNameSF = + pathName + "/Code/GraphMol/Descriptors/test_data/NH3.out"; + + std::ifstream instrmSF; + instrmSF.open(fNameSF); + + std::string line; + std::vector tokens; + std::vector> expectedOutput; + + while (!instrmSF.eof()) { + std::getline(instrmSF, line); + tokens = tokenize(line); + std::vector row; + for (auto v : tokens) { + std::istringstream os(v); + double d; + os >> d; + row.push_back(d); + } + expectedOutput.push_back(row); + } + + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + int confId = -1; + + auto aev = RDKit::Descriptors::ANI::AtomicEnvironmentVector(*mol, ¶ms, confId); + + CHECK(aev.rows() == mol->getNumAtoms()); + CHECK(aev.cols() == 384); + + auto aevOutput = EigenMatToSTLVector(aev); + + for (unsigned int i = 0; i < expectedOutput.size(); i++) { + for (unsigned int j = 0; j < expectedOutput[i].size(); j++) { + auto diff = std::fabs(expectedOutput[i][j] - aevOutput[i][j]); + CHECK(diff < 0.2); + } + } + } + + SECTION("Ethanol") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/ethanol.sdf"; + + std::string fNameSF = + pathName + "/Code/GraphMol/Descriptors/test_data/ethanol.out"; + + std::ifstream instrmSF; + instrmSF.open(fNameSF); + + std::string line; + std::vector tokens; + std::vector> expectedOutput; + + while (!instrmSF.eof()) { + std::getline(instrmSF, line); + tokens = tokenize(line); + std::vector row; + for (auto v : tokens) { + std::istringstream os(v); + double d; + os >> d; + row.push_back(d); + } + expectedOutput.push_back(row); + } + + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, false, false)); + int confId = -1; + + auto aev = RDKit::Descriptors::ANI::AtomicEnvironmentVector(*mol, ¶ms, confId); + + CHECK(aev.rows() == mol->getNumAtoms()); + CHECK(aev.cols() == 384); + + auto aevOutput = EigenMatToSTLVector(aev); + + for (unsigned int i = 0; i < expectedOutput.size(); i++) { + for (unsigned int j = 0; j < expectedOutput[i].size(); j++) { + auto diff = std::fabs(expectedOutput[i][j] - aevOutput[i][j]); + CHECK(diff < 0.2); + } + } + } +} + +TEST_CASE("Species Vector Generation", "[Atomic Species Encoding]") { + SECTION("CH4") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/CH4.mol"; + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + auto numAtoms = mol->getNumAtoms(); + CHECK(speciesVec.size() == numAtoms); + VectorXi expected(5); + expected << 0, 0, 0, 1, 0; + CHECK(((expected - speciesVec).array() == 0).count() == numAtoms); + int atomNums[] = {1, 1, 1, 6, 1}; + speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(atomNums, 5); + CHECK(speciesVec.size() == 5); + CHECK(((expected - speciesVec).array() == 0).count() == numAtoms); + } + SECTION("SO2") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/SO2.mol"; + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + REQUIRE_THROWS_AS(RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol), + ValueErrorException); + } + SECTION("NH3") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/NH3.mol"; + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + auto numAtoms = mol->getNumAtoms(); + CHECK(speciesVec.size() == numAtoms); + VectorXi expected(4); + expected << 0, 0, 2, 0; + CHECK(((expected - speciesVec).array() == 0).count() == numAtoms); + int atomNums[] = {1, 1, 7, 1}; + speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(atomNums, 4); + CHECK(speciesVec.size() == 4); + CHECK(((expected - speciesVec).array() == 0).count() == numAtoms); + } + SECTION("Ethanol") { + std::string pathName = getenv("RDBASE"); + + std::string molFile = + pathName + "/Code/GraphMol/Descriptors/test_data/ethanol.sdf"; + RDKit::ROMOL_SPTR mol(RDKit::MolFileToMol(molFile, true, false)); + auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(*mol); + auto numAtoms = mol->getNumAtoms(); + CHECK(speciesVec.size() == numAtoms); + VectorXi expected(9); + expected << 3, 1, 1, 0, 0, 0, 0, 0, 0; + CHECK(((expected - speciesVec).array() == 0).count() == numAtoms); + + int atomNums[] = {8, 6, 6, 1, 1, 1, 1, 1, 1}; + speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(atomNums, 9); + CHECK(speciesVec.size() == sizeof(atomNums) / sizeof(int)); + CHECK(((expected - speciesVec).array() == 0).count() == numAtoms); + } +} \ No newline at end of file diff --git a/Code/GraphMol/Descriptors/CMakeLists.txt b/Code/GraphMol/Descriptors/CMakeLists.txt index 2bdb5c2ed69..25440865c10 100644 --- a/Code/GraphMol/Descriptors/CMakeLists.txt +++ b/Code/GraphMol/Descriptors/CMakeLists.txt @@ -29,6 +29,11 @@ rdkit_headers(Crippen.h BCUT.h Lipinski.h ${DESC3D_HDRS} DEST GraphMol/Descriptors) +rdkit_library(ANIDescriptors + AtomicEnvironmentVector.cpp + LINK_LIBRARIES RDGeneral EigenSerializer) +rdkit_headers(AtomicEnvironmentVector.h DEST GraphMol/Descriptors) + rdkit_test(testDescriptors test.cpp LINK_LIBRARIES PartialCharges Descriptors ) @@ -64,6 +69,10 @@ LINK_LIBRARIES Descriptors ) LINK_LIBRARIES Descriptors ) rdkit_test(testCoulombMat testCoulombMat.cpp LINK_LIBRARIES Descriptors ForceFieldHelpers DistGeomHelpers ) +if(RDK_HAS_EIGEN) + rdkit_catch_test(AtomicEnvironmentVectorCatchTest AtomicEnvironmentVector_catch.cpp catch_main.cpp +LINK_LIBRARIES ANIDescriptors FileParsers SmilesParse EigenSerializer) +endif(RDK_HAS_EIGEN) endif(RDK_BUILD_DESCRIPTORS3D) diff --git a/Code/GraphMol/Descriptors/MolDescriptors3D.h b/Code/GraphMol/Descriptors/MolDescriptors3D.h index b2673991c79..e73e85b5823 100644 --- a/Code/GraphMol/Descriptors/MolDescriptors3D.h +++ b/Code/GraphMol/Descriptors/MolDescriptors3D.h @@ -21,5 +21,4 @@ #include #include #include - #endif diff --git a/Code/GraphMol/Descriptors/Wrap/CMakeLists.txt b/Code/GraphMol/Descriptors/Wrap/CMakeLists.txt index dd1dd6c1dd0..a774a5a99f2 100644 --- a/Code/GraphMol/Descriptors/Wrap/CMakeLists.txt +++ b/Code/GraphMol/Descriptors/Wrap/CMakeLists.txt @@ -2,7 +2,7 @@ remove_definitions(-DRDKIT_DESCRIPTORS_BUILD) rdkit_python_extension(rdMolDescriptors rdMolDescriptors.cpp DEST Chem LINK_LIBRARIES -LINK_LIBRARIES Descriptors Fingerprints ) +LINK_LIBRARIES Descriptors Fingerprints ANIDescriptors) add_pytest(pyMolDescriptors ${CMAKE_CURRENT_SOURCE_DIR}/testMolDescriptors.py) add_pytest(pyMolDescriptors3D ${CMAKE_CURRENT_SOURCE_DIR}/test3D.py) diff --git a/Code/GraphMol/Descriptors/Wrap/rdMolDescriptors.cpp b/Code/GraphMol/Descriptors/Wrap/rdMolDescriptors.cpp index 0173e4782df..8eb70718d2f 100644 --- a/Code/GraphMol/Descriptors/Wrap/rdMolDescriptors.cpp +++ b/Code/GraphMol/Descriptors/Wrap/rdMolDescriptors.cpp @@ -117,7 +117,6 @@ python::tuple calcCrippenDescriptors(const RDKit::ROMol &mol, } #ifdef RDK_BUILD_DESCRIPTORS3D - python::tuple calcCoulombMat(const RDKit::ROMol &mol, int confId) { std::vector> results; RDKit::Descriptors::CoulombMat(mol, results, confId); diff --git a/Code/GraphMol/Descriptors/catch_main.cpp b/Code/GraphMol/Descriptors/catch_main.cpp new file mode 100644 index 00000000000..6f22ebe7e78 --- /dev/null +++ b/Code/GraphMol/Descriptors/catch_main.cpp @@ -0,0 +1,12 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do + // this in one cpp file +#include "catch.hpp" diff --git a/Code/GraphMol/Descriptors/test_data/CH4.mol b/Code/GraphMol/Descriptors/test_data/CH4.mol new file mode 100644 index 00000000000..70a33822053 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/CH4.mol @@ -0,0 +1,14 @@ + + Marvin 06190621052D + + 5 4 0 0 0 0 999 V2000 + 0.0000 1.8250 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8250 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8250 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.8250 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4 1 1 0 0 0 0 + 4 2 1 0 0 0 0 + 4 3 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END diff --git a/Code/GraphMol/Descriptors/test_data/CH4.out b/Code/GraphMol/Descriptors/test_data/CH4.out new file mode 100644 index 00000000000..375355481d4 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/CH4.out @@ -0,0 +1,5 @@ +5.873807914151915627e-21,3.509429024646385301e-15,2.078682226347439155e-10,1.220607259710959624e-06,7.105630938895046711e-04,4.100770875811576843e-02,2.346197515726089478e-01,1.330766230821609497e-01,7.643423508852720261e-03,8.840149268507957458e-03,4.783231392502784729e-02,2.577941119670867920e-02,1.377406762912869453e-03,7.296021522051887587e-06,3.831349459915145417e-09,1.994566756766472104e-13,2.056713128695264459e-07,1.845465012593194842e-04,1.641623303294181824e-02,1.447699368000030518e-01,1.265669316053390503e-01,1.096979528665542603e-02,9.425713506061583757e-05,8.029103781836965936e-08,6.780430817504567997e-12,5.676550776446793946e-17,4.711328183747742784e-23,3.876543013192586165e-30,3.162143489924560031e-38,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.494633555859921553e-19,2.532693945585533409e-15,4.706586682889923878e-13,5.779792876942080326e-12,5.779805020006412164e-12,4.706606740630114860e-13,2.532693945585533409e-15,5.494633555859921553e-19,7.315792936724019313e-13,3.372138568380478318e-09,6.266554350986552890e-07,7.695467502344399691e-06,7.695482054259628057e-06,6.266579930525040254e-07,3.372138568380478318e-09,7.315792936724019313e-13,1.129154991730274560e-09,5.204722128837602213e-06,9.672102751210331917e-04,1.187755726277828217e-02,1.187758054584264755e-02,9.672142914496362209e-04,5.204722128837602213e-06,1.129154991730274560e-09,2.020294598281680010e-09,9.312337169831153005e-06,1.730541698634624481e-03,2.125143446028232574e-02,2.125147730112075806e-02,1.730548916384577751e-03,9.312337169831153005e-06,2.020294598281680010e-09,1.380327763200739355e-08,2.338356495101834298e-07,3.181309295996470610e-07,3.562540840107430995e-08,2.741213922519136759e-10,9.233437717756989849e-14,5.443757812284847585e-19,8.097996155763898336e-27,3.606971877161413431e-04,6.110422313213348389e-03,8.313165046274662018e-03,9.309371816925704479e-04,7.163140708144055679e-06,2.412814614771718880e-09,1.422523225244869821e-14,2.116109028400287668e-22,1.092629320919513702e-02,1.850978285074234009e-01,2.518236637115478516e-01,2.820008806884288788e-02,2.169869258068501949e-04,7.308934613092787913e-08,4.309128466377376565e-13,6.410149319171241237e-21,3.836830437649041414e-04,6.499816663563251495e-03,8.842932060360908508e-03,9.902622550725936890e-04,7.619620191690046340e-06,2.566574064388760235e-09,1.513175232358866806e-14,2.250960698071112487e-22,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +5.873807914151915627e-21,3.509429024646385301e-15,2.078682226347439155e-10,1.220607259710959624e-06,7.105630938895046711e-04,4.100770875811576843e-02,2.346197515726089478e-01,1.330766379833221436e-01,7.643423508852720261e-03,8.840149268507957458e-03,4.783231392502784729e-02,2.577941119670867920e-02,1.377406762912869453e-03,7.296021522051887587e-06,3.831349459915145417e-09,1.994566756766472104e-13,2.056713128695264459e-07,1.845465012593194842e-04,1.641623303294181824e-02,1.447699368000030518e-01,1.265669316053390503e-01,1.096979528665542603e-02,9.425713506061583757e-05,8.029103781836965936e-08,6.780430817504567997e-12,5.676550776446793946e-17,4.711328183747742784e-23,3.876543013192586165e-30,3.162143489924560031e-38,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.494633555859921553e-19,2.532693945585533409e-15,4.706586682889923878e-13,5.779792876942080326e-12,5.779805020006412164e-12,4.706606740630114860e-13,2.532693945585533409e-15,5.494633555859921553e-19,7.315792936724019313e-13,3.372138568380478318e-09,6.266554350986552890e-07,7.695467502344399691e-06,7.695482054259628057e-06,6.266579930525040254e-07,3.372138568380478318e-09,7.315792936724019313e-13,1.129154991730274560e-09,5.204722128837602213e-06,9.672102751210331917e-04,1.187755726277828217e-02,1.187758054584264755e-02,9.672142914496362209e-04,5.204722128837602213e-06,1.129154991730274560e-09,2.020294598281680010e-09,9.312337169831153005e-06,1.730541698634624481e-03,2.125143446028232574e-02,2.125147730112075806e-02,1.730548916384577751e-03,9.312337169831153005e-06,2.020294598281680010e-09,1.380327763200739355e-08,2.338356495101834298e-07,3.181309295996470610e-07,3.562540840107430995e-08,2.741213922519136759e-10,9.233437717756989849e-14,5.443757812284847585e-19,8.097996155763898336e-27,3.606971877161413431e-04,6.110422313213348389e-03,8.313165046274662018e-03,9.309371816925704479e-04,7.163140708144055679e-06,2.412814614771718880e-09,1.422523225244869821e-14,2.116109028400287668e-22,1.092629320919513702e-02,1.850978285074234009e-01,2.518236637115478516e-01,2.820008806884288788e-02,2.169869258068501949e-04,7.308934613092787913e-08,4.309128466377376565e-13,6.410149319171241237e-21,3.836830437649041414e-04,6.499816663563251495e-03,8.842932060360908508e-03,9.902622550725936890e-04,7.619620191690046340e-06,2.566574064388760235e-09,1.513175232358866806e-14,2.250960698071112487e-22,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +5.873807914151915627e-21,3.509429024646385301e-15,2.078682226347439155e-10,1.220607259710959624e-06,7.105630938895046711e-04,4.100770875811576843e-02,2.346197515726089478e-01,1.330766230821609497e-01,7.643423508852720261e-03,8.840149268507957458e-03,4.783231392502784729e-02,2.577941119670867920e-02,1.377406762912869453e-03,7.296021522051887587e-06,3.831349459915145417e-09,1.994566756766472104e-13,2.056713128695264459e-07,1.845465012593194842e-04,1.641623303294181824e-02,1.447699368000030518e-01,1.265669316053390503e-01,1.096979528665542603e-02,9.425713506061583757e-05,8.029103781836965936e-08,6.780430817504567997e-12,5.676550776446793946e-17,4.711328183747742784e-23,3.876543013192586165e-30,3.162143489924560031e-38,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.494633555859921553e-19,2.532693945585533409e-15,4.706586682889923878e-13,5.779792876942080326e-12,5.779805020006412164e-12,4.706606740630114860e-13,2.532693945585533409e-15,5.494633555859921553e-19,7.315792936724019313e-13,3.372138568380478318e-09,6.266554350986552890e-07,7.695467502344399691e-06,7.695482054259628057e-06,6.266579930525040254e-07,3.372138568380478318e-09,7.315792936724019313e-13,1.129154991730274560e-09,5.204722128837602213e-06,9.672102751210331917e-04,1.187755726277828217e-02,1.187758054584264755e-02,9.672142914496362209e-04,5.204722128837602213e-06,1.129154991730274560e-09,2.020294598281680010e-09,9.312337169831153005e-06,1.730541698634624481e-03,2.125143446028232574e-02,2.125147730112075806e-02,1.730548916384577751e-03,9.312337169831153005e-06,2.020294598281680010e-09,1.380327763200739355e-08,2.338356495101834298e-07,3.181309295996470610e-07,3.562540840107430995e-08,2.741213922519136759e-10,9.233437717756989849e-14,5.443757812284847585e-19,8.097996155763898336e-27,3.606971877161413431e-04,6.110422313213348389e-03,8.313165046274662018e-03,9.309371816925704479e-04,7.163140708144055679e-06,2.412814614771718880e-09,1.422523225244869821e-14,2.116109028400287668e-22,1.092629320919513702e-02,1.850978285074234009e-01,2.518236637115478516e-01,2.820008806884288788e-02,2.169869258068501949e-04,7.308934613092787913e-08,4.309128466377376565e-13,6.410149319171241237e-21,3.836830437649041414e-04,6.499816663563251495e-03,8.842932060360908508e-03,9.902622550725936890e-04,7.619620191690046340e-06,2.566574064388760235e-09,1.513175232358866806e-14,2.250960698071112487e-22,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +8.226852514781057835e-07,7.381860050372779369e-04,6.566493213176727295e-02,5.790797472000122070e-01,5.062677264213562012e-01,4.387918114662170410e-02,3.770285402424633503e-04,3.211641512734786374e-07,2.712172327001827199e-11,2.270620310578717578e-16,1.884531273499097113e-22,1.550617205277034466e-29,1.264857395969824012e-37,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.293181811634624978e-10,5.960787348158191890e-07,1.107712232624180615e-04,1.360295224003493786e-03,1.360375666990876198e-03,1.361838658340275288e-04,5.133349332027137280e-04,8.235489949584007263e-04,6.632198079614681774e-08,3.057042486034333706e-04,5.681000649929046631e-02,6.976395249366760254e-01,6.976807117462158203e-01,6.984310597181320190e-02,2.632684111595153809e-01,4.223644137382507324e-01,3.942979986959471717e-08,1.817475422285497189e-04,3.377473354339599609e-02,4.147612154483795166e-01,4.147857427597045898e-01,4.152318090200424194e-02,1.565185338258743286e-01,2.511044740676879883e-01,2.717450743594529428e-11,1.252580688060334069e-07,2.327711081306915730e-05,2.858480729628354311e-04,2.858649822883307934e-04,2.861723987734876573e-05,1.078705608961172402e-04,1.730579388095065951e-04,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +5.873807914151915627e-21,3.509429024646385301e-15,2.078682226347439155e-10,1.220607259710959624e-06,7.105630938895046711e-04,4.100770875811576843e-02,2.346197515726089478e-01,1.330766379833221436e-01,7.643423508852720261e-03,8.840149268507957458e-03,4.783231392502784729e-02,2.577941119670867920e-02,1.377406762912869453e-03,7.296021522051887587e-06,3.831349459915145417e-09,1.994566756766472104e-13,2.056713128695264459e-07,1.845465012593194842e-04,1.641623303294181824e-02,1.447699368000030518e-01,1.265669316053390503e-01,1.096979528665542603e-02,9.425713506061583757e-05,8.029103781836965936e-08,6.780430817504567997e-12,5.676550776446793946e-17,4.711328183747742784e-23,3.876543013192586165e-30,3.162143489924560031e-38,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.494633555859921553e-19,2.532693945585533409e-15,4.706586682889923878e-13,5.779792876942080326e-12,5.779805020006412164e-12,4.706606740630114860e-13,2.532693945585533409e-15,5.494633555859921553e-19,7.315792936724019313e-13,3.372138568380478318e-09,6.266554350986552890e-07,7.695467502344399691e-06,7.695482054259628057e-06,6.266579930525040254e-07,3.372138568380478318e-09,7.315792936724019313e-13,1.129154991730274560e-09,5.204722128837602213e-06,9.672102751210331917e-04,1.187755726277828217e-02,1.187758054584264755e-02,9.672142914496362209e-04,5.204722128837602213e-06,1.129154991730274560e-09,2.020294598281680010e-09,9.312337169831153005e-06,1.730541698634624481e-03,2.125143446028232574e-02,2.125147730112075806e-02,1.730548916384577751e-03,9.312337169831153005e-06,2.020294598281680010e-09,1.380327763200739355e-08,2.338356495101834298e-07,3.181309295996470610e-07,3.562540840107430995e-08,2.741213922519136759e-10,9.233437717756989849e-14,5.443757812284847585e-19,8.097996155763898336e-27,3.606971877161413431e-04,6.110422313213348389e-03,8.313165046274662018e-03,9.309371816925704479e-04,7.163140708144055679e-06,2.412814614771718880e-09,1.422523225244869821e-14,2.116109028400287668e-22,1.092629320919513702e-02,1.850978285074234009e-01,2.518236637115478516e-01,2.820008806884288788e-02,2.169869258068501949e-04,7.308934613092787913e-08,4.309128466377376565e-13,6.410149319171241237e-21,3.836830437649041414e-04,6.499816663563251495e-03,8.842932060360908508e-03,9.902622550725936890e-04,7.619620191690046340e-06,2.566574064388760235e-09,1.513175232358866806e-14,2.250960698071112487e-22,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 diff --git a/Code/GraphMol/Descriptors/test_data/NH3.mol b/Code/GraphMol/Descriptors/test_data/NH3.mol new file mode 100644 index 00000000000..a326e2a39d9 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/NH3.mol @@ -0,0 +1,12 @@ + + Marvin 09260512442D + + 4 3 0 0 0 0 999 V2000 + 8.2750 -5.9408 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 9.2030 -6.3252 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 8.9895 -5.5283 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0 + 9.7864 -5.7418 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 1 0 0 0 0 + 3 2 1 0 0 0 0 + 3 4 1 0 0 0 0 +M END diff --git a/Code/GraphMol/Descriptors/test_data/NH3.out b/Code/GraphMol/Descriptors/test_data/NH3.out new file mode 100644 index 00000000000..5ede554b1d8 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/NH3.out @@ -0,0 +1,4 @@ +1.915958672761917114e-01,1.743368804454803467e-01,1.891043037176132202e-01,1.183127909898757935e-01,7.794830948114395142e-03,5.094799053040333092e-05,3.301330053773199324e-08,2.120743901670718579e-12,1.350591801009327997e-17,8.527056270910829097e-24,5.337032583948006911e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.145961523056030273e-01,3.545814752578735352e-02,5.808281130157411098e-04,9.432276328880107030e-07,1.518519754384328735e-10,2.423598219561547661e-15,3.834781854814560126e-21,6.015288291666250032e-28,9.354372248230749621e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,8.779090642929077148e-02,3.355976641178131104e-01,1.070499196648597717e-01,2.598614664748311043e-03,3.469641114861587994e-06,1.283919082162299219e-10,3.245477874937531310e-17,2.215212710939965105e-27,1.323279738426208496e-01,5.058491826057434082e-01,1.613572537899017334e-01,3.916913643479347229e-03,5.229819635133026168e-06,1.935262228247580651e-10,4.891936216471255033e-17,3.339009011301450078e-27,2.312184806214645505e-04,8.838772191666066647e-04,2.819417568389326334e-04,6.844077233836287633e-06,9.138135581565620669e-09,3.381510295299289259e-13,8.547746469294577653e-20,5.834295940645282985e-30,4.683437526686873298e-10,1.790334325235676260e-09,5.710860673246997976e-10,1.386299495337306453e-11,1.850971632910702880e-14,6.849404955747872802e-19,1.731385751803254671e-25,1.181763630111179250e-35,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.851384282112121582e-01,1.016515970230102539e+00,1.484521627426147461e+00,3.394635319709777832e-01,6.097359117120504379e-03,5.723012236558133736e-06,1.335299509852561073e-10,1.689565535667944676e-17,1.620379388332366943e-01,3.365184664726257324e-01,1.072475239634513855e-01,1.403800677508115768e-02,2.423207042738795280e-04,2.271507213436052552e-07,5.299819610948830473e-12,6.705905663082173561e-19,1.110440789489075541e-04,2.190395316574722528e-04,3.814884621533565223e-05,1.033971557262702845e-06,1.136618976715908502e-08,1.045371948726891986e-11,2.438441624929232020e-16,3.085378573004127395e-23,8.845488924658084784e-11,1.738621330238387941e-10,2.849761572554232458e-11,3.643466550597856957e-13,7.791564384821098119e-16,5.595887183678889133e-19,1.300582037119036539e-23,1.645625134992979674e-30,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +4.058131575584411621e-01,1.833049505949020386e-01,1.191304903477430344e-02,8.705563232069835067e-05,6.502388316675933311e-08,4.847359492965441774e-12,3.587600768906198619e-17,2.633139919942482615e-23,1.916041873987214902e-30,1.382273595594064759e-38,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.145859003067016602e-01,3.544996306300163269e-02,5.805877735838294029e-04,9.426642577636812348e-07,1.517337783196737178e-10,2.421259138077704910e-15,3.830378975977919230e-21,6.007282200887432293e-28,9.340139898720702186e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,6.991862058942921454e-13,1.677332335248138406e-07,6.408743211068212986e-04,1.023046672344207764e-01,1.097691893577575684e+00,9.638177752494812012e-01,6.853694468736648560e-02,3.163935034535825253e-04,2.775460660993725459e-14,6.658268159043245760e-09,2.543987829994875938e-05,4.061043728142976761e-03,4.357352107763290405e-02,3.825930878520011902e-02,2.720613731071352959e-03,1.255942424904787913e-05,1.277161178915163428e-18,3.063881613696306516e-13,1.170646357628868373e-09,1.868737626864458434e-07,2.005087480938527733e-06,1.760547661433520261e-06,1.251922867595567368e-07,5.779368095204517886e-10,6.812840052057806459e-26,1.634385136430326510e-20,6.244651141958822886e-17,9.968521539097888878e-15,1.069586178523498909e-13,9.391398520398192007e-14,6.678209349994350397e-15,3.082923980553305544e-17,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.508355140686035156e-02,6.939407587051391602e-01,2.742581367492675781e+00,1.044115662574768066e+00,3.526234254240989685e-02,7.809900853317230940e-05,6.077900849277284578e-09,4.846624268367225041e-15,5.407118005678057671e-04,2.241441980004310608e-02,7.645310461521148682e-02,2.445023134350776672e-02,6.973572308197617531e-04,1.357162659587629605e-06,9.810699475032436112e-11,7.607361717968481526e-17,2.382763319985770067e-08,9.384157237946055830e-07,2.931044946308247745e-06,8.174096706170530524e-07,1.937596039169875439e-08,3.090460873322875557e-11,1.923581118270178102e-15,1.395524274339869622e-21,1.248756533698018242e-15,4.810009744562852851e-14,1.440161466643996580e-13,3.714319094807148891e-14,7.667614877275824147e-16,9.866311527536229325e-19,4.825147875052289163e-23,3.027747243333882032e-29,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +6.437677145004272461e-01,1.063578873872756958e-01,1.741998130455613136e-03,2.828543301802710630e-06,4.553169508092480555e-10,7.266061226817149138e-15,1.149543883257453030e-20,1.802967021157888393e-27,2.803429474819491431e-35,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.432888373732566833e-03,2.304280847311019897e-01,1.913444995880126953e+00,2.120016813278198242e+00,4.577322006225585938e-01,1.217520475387573242e+00,8.918554186820983887e-01,5.266190320253372192e-02,3.797316094278357923e-05,3.596608294174075127e-03,2.986651845276355743e-02,3.309224173426628113e-02,7.145149633288383484e-03,1.900546625256538391e-02,1.392184197902679443e-02,8.220509625971317291e-04,6.870669033709475571e-10,6.507566041591417161e-08,5.404069725045701489e-07,5.987988060951465741e-07,1.292942499730997952e-07,3.439132854055060307e-07,2.519226143249397865e-07,1.487541911870948752e-08,1.441100166555593924e-17,1.364950501699113434e-15,1.133522529311870031e-14,1.256054146055087667e-14,2.712186368097587244e-15,7.214256691763076129e-15,5.284571642316746726e-15,3.120411408867514733e-16,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +2.150005698204040527e-01,6.196862831711769104e-02,1.783535182476043701e-01,1.182276234030723572e-01,7.794766221195459366e-03,5.094798689242452383e-05,3.301330053773199324e-08,2.120743901670718579e-12,1.350591801009327997e-17,8.527056270910829097e-24,5.337032583948006911e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.145856469869613647e-01,3.544978052377700806e-02,5.805822438560426235e-04,9.426515248378564138e-07,1.517311831733536565e-10,2.421203657419659754e-15,3.830277193988483994e-21,6.007099237542715506e-28,9.339783318708276236e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,6.356262415647506714e-02,5.003883242607116699e-01,3.253521919250488281e-01,1.688029244542121887e-02,5.440984750748611987e-05,6.223038084840482043e-09,8.126287559257882459e-15,1.004690172331950273e-23,3.769055753946304321e-02,2.967138886451721191e-01,1.929232031106948853e-01,1.000945921987295151e-02,3.226325497962534428e-05,3.690057814864644570e-09,4.818622629680418754e-15,5.957483867116322923e-24,2.590788426459766924e-05,2.039563842117786407e-04,1.326123310718685389e-04,6.880341970827430487e-06,2.217724492936667957e-08,2.536486645721147681e-12,3.312243964874902077e-18,4.095079033289324805e-27,2.064441499693980830e-11,1.625204137933877746e-10,1.056706805391272042e-10,5.482525891609135726e-12,1.767169581241151421e-14,2.021171779405704675e-18,2.639325457186411090e-24,3.263119053294898487e-33,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.748638689517974854e-01,7.483146786689758301e-01,1.432752728462219238e+00,7.066213488578796387e-01,2.916375547647476196e-02,7.237315003294497728e-05,5.944376102462456402e-09,4.829883932714164677e-15,1.615564823150634766e-01,3.207315206527709961e-01,7.279863953590393066e-02,1.162113435566425323e-02,4.556377243716269732e-04,1.129902557295281440e-06,9.280434754010968845e-11,7.540475231892953666e-17,1.109984223148785532e-04,2.181865856982767582e-04,3.597382965381257236e-05,6.152750984256272204e-07,8.472620827149057732e-09,2.045160915620236608e-11,1.679571254956948277e-15,1.364673729250426996e-21,8.842526710850506788e-11,1.737694987902216326e-10,2.836333945488433983e-11,3.355125693330768266e-13,3.581901693009055272e-16,4.311843086585460247e-19,3.523706926179647986e-23,2.863050441359946127e-29,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 diff --git a/Code/GraphMol/Descriptors/test_data/SO2.mol b/Code/GraphMol/Descriptors/test_data/SO2.mol new file mode 100644 index 00000000000..5d4c422f6cf --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/SO2.mol @@ -0,0 +1,10 @@ +74457-86-6.MOL + ChemDraw01102001342D + + 3 2 0 0 0 0 0 0 0 0999 V2000 + 0.0000 0.0000 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8250 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.8250 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 2 0 + 1 3 2 0 +M END diff --git a/Code/GraphMol/Descriptors/test_data/SO2.out b/Code/GraphMol/Descriptors/test_data/SO2.out new file mode 100644 index 00000000000..fd7b76fe796 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/SO2.out @@ -0,0 +1,3 @@ +0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.380187834205571562e-05,4.741650540381669998e-03,9.364484250545501709e-02,1.833476722240447998e-01,3.558800742030143738e-02,6.848070770502090454e-04,1.306383182964054868e-06,2.470644244745301421e-10,4.632198724802746165e-15,8.609952551621839395e-21,1.586521480654426111e-27,2.898212316432303173e-35,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.380187834205571562e-05,4.741650540381669998e-03,9.364484250545501709e-02,1.833476722240447998e-01,3.558800742030143738e-02,6.848070770502090454e-04,1.306383182964054868e-06,2.470644244745301421e-10,4.632198724802746165e-15,8.609952551621839395e-21,1.586521480654426111e-27,2.898212316432303173e-35,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 diff --git a/Code/GraphMol/Descriptors/test_data/ethanol.mol b/Code/GraphMol/Descriptors/test_data/ethanol.mol new file mode 100644 index 00000000000..561d13602c1 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/ethanol.mol @@ -0,0 +1,10 @@ +ChEBI + Marvin 10060515352D + + 3 2 0 0 0 0 999 V2000 + 4.8667 -3.3230 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5812 -2.9105 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 6.2956 -3.3230 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 1 0 0 0 0 +M END diff --git a/Code/GraphMol/Descriptors/test_data/ethanol.out b/Code/GraphMol/Descriptors/test_data/ethanol.out new file mode 100644 index 00000000000..5b465f8f2cc --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/ethanol.out @@ -0,0 +1,9 @@ +2.105637788772583008e-01,1.236776337027549744e-01,8.017338812351226807e-03,4.991933703422546387e-02,3.028055131435394287e-01,1.993693113327026367e-01,1.890062838792800903e-01,1.851396262645721436e-01,3.673875331878662109e-02,7.011679559946060181e-02,2.744782716035842896e-02,1.068178913556039333e-03,4.121168331039370969e-06,1.576268338077113640e-09,5.977022262543263409e-14,2.246813829210676053e-19,2.743636025115847588e-03,7.545576244592666626e-02,2.057286798954010010e-01,5.568897351622581482e-02,1.057545933872461319e-02,1.005694717168807983e-01,1.103549152612686157e-01,1.200525835156440735e-02,1.294758258154615760e-04,1.384340180266008247e-07,1.467339791338950761e-11,1.541910851564248547e-16,1.606291701856487116e-22,1.658894039993423202e-29,1.698498846688573210e-37,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.539611614338355139e-07,3.274848495493642986e-05,1.622145180590450764e-03,2.034610882401466370e-02,2.553126402199268341e-02,2.505345083773136139e-02,2.272445894777774811e-02,1.843956997618079185e-03,4.970590234734117985e-04,2.528304234147071838e-02,1.721072793006896973e-01,5.592579841613769531e-01,6.365059018135070801e-01,5.035213232040405273e-01,4.384850859642028809e-01,3.556319326162338257e-02,3.465927205979824066e-03,1.154814139008522034e-01,4.663010835647583008e-01,4.093811810016632080e-01,1.524315029382705688e-01,2.316186577081680298e-02,9.914888069033622742e-03,7.951491861604154110e-04,3.261845326051115990e-03,3.185696527361869812e-02,5.472405254840850830e-02,4.657283052802085876e-02,1.128849852830171585e-02,3.170037234667688608e-04,9.544027079755323939e-07,2.073030103133532975e-08,9.022377780638635159e-04,3.575213486328721046e-03,2.289792988449335098e-03,7.931775599718093872e-02,4.913521409034729004e-01,2.584379017353057861e-01,1.074776425957679749e-02,2.687547748791985214e-05,1.819441318511962891e-01,7.356678247451782227e-01,3.280442059040069580e-01,3.480191230773925781e-01,5.772143006324768066e-01,2.052693665027618408e-01,8.017910644412040710e-03,1.991356657526921481e-05,7.030386477708816528e-02,3.735774755477905273e-01,6.840484738349914551e-01,2.563126981258392334e-01,3.492289036512374878e-02,2.024794463068246841e-03,1.456789323128759861e-05,1.831417684172720328e-08,2.441784925758838654e-02,5.709135159850120544e-02,2.559222467243671417e-02,6.295464001595973969e-03,1.963421091204509139e-04,6.315673886092554312e-07,1.214604306021271896e-09,2.053626095132460305e-13,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.126373899751342833e-05,8.279826579382643104e-05,5.035234062233939767e-05,2.434364660075516440e-06,7.236343968486380618e-09,7.472383714395014476e-13,8.433708118873749473e-19,8.128206292871556518e-28,1.318359747529029846e-02,9.691089391708374023e-02,5.893469601869583130e-02,2.849292010068893433e-03,8.469749445794150233e-06,8.746021129546477368e-10,9.871199147524264278e-16,9.513627018224667428e-25,1.788770221173763275e-02,1.314901560544967651e-01,7.996347546577453613e-02,3.865962382405996323e-03,1.149188392446376383e-05,1.186673315167752207e-09,1.339339084110340375e-15,1.290823157189683185e-24,2.813489481923170388e-05,2.068159083137288690e-04,1.257715484825894237e-04,6.080626462789950892e-06,1.807515026541750558e-08,1.866473772413335119e-12,2.106596168830127811e-18,2.030287036202841544e-27,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +2.451939582824707031e-01,4.089832007884979248e-01,7.039167732000350952e-02,8.640004694461822510e-02,4.453961253166198730e-01,4.658142626285552979e-01,6.570082157850265503e-02,9.818930411711335182e-04,1.471530822527711280e-06,2.190474468477532355e-10,3.233585122076497106e-15,4.732665407108131063e-21,6.867201735854069456e-28,9.878603698611622703e-36,0.000000000000000000e+00,0.000000000000000000e+00,4.851471749134361744e-04,2.995575591921806335e-02,1.833678930997848511e-01,1.112764999270439148e-01,6.694531999528408051e-03,3.992759957327507436e-05,2.360827622283068195e-08,1.383862100433341791e-12,8.041902027619125896e-18,4.632989562693864985e-24,2.646029085042773096e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.743636025115847588e-03,7.545576244592666626e-02,2.057286053895950317e-01,5.560760200023651123e-02,1.490081544034183025e-03,3.958421530114719644e-06,1.042491426517244690e-09,2.721825857147225358e-14,7.045059795492630398e-20,1.807783848985998645e-26,4.598743285348028951e-34,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,3.853380192708755203e-08,6.553398634423501790e-06,2.741972682997584343e-03,1.467671245336532593e-01,8.656159043312072754e-01,5.146993398666381836e-01,5.340685695409774780e-02,2.513740211725234985e-03,6.273456383496522903e-04,1.635817997157573700e-02,1.139931455254554749e-01,1.439669609069824219e+00,2.639534711837768555e+00,1.634940385818481445e+00,1.185510039329528809e+00,9.849685430526733398e-02,1.208010781556367874e-02,3.005358874797821045e-01,7.052572965621948242e-01,5.410137176513671875e-01,4.549297988414764404e-01,3.012605309486389160e-01,9.753738343715667725e-02,6.216130685061216354e-03,2.701789780985563993e-04,6.639830302447080612e-03,1.370204705744981766e-02,4.775091074407100677e-03,2.296929946169257164e-03,1.635336317121982574e-03,2.344898966839537024e-04,2.900733534261235036e-06,3.182068467140197754e-04,1.039148773998022079e-03,6.977269076742231846e-04,4.799110442399978638e-02,4.277259409427642822e-01,3.192716240882873535e-01,1.922933198511600494e-02,7.363027543760836124e-05,1.843958199024200439e-01,6.020187139511108398e-01,1.766415238380432129e-01,3.317808508872985840e-01,1.300155878067016602e+00,7.655391693115234375e-01,4.400505870580673218e-02,1.672958169365301728e-04,1.238701045513153076e-01,4.043917059898376465e-01,1.128230318427085876e-01,5.228015780448913574e-02,7.714993506669998169e-02,1.114049647003412247e-02,1.943217357620596886e-04,4.705892138190392870e-07,9.646204125601798296e-05,3.149066469632089138e-04,8.648019138490781188e-05,1.467252604925306514e-05,1.937920751515775919e-05,2.403396365480148233e-06,2.097796603095503087e-08,9.304425285794337697e-12,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.176657504402101040e-03,3.884178819134831429e-03,2.044484950602054596e-03,9.360668808221817017e-02,6.578649282455444336e-01,3.861161768436431885e-01,1.848304457962512970e-02,8.960827835835516453e-05,1.394110172986984253e-01,4.601929485797882080e-01,1.460770368576049805e-01,4.478983879089355469e-01,1.376454710960388184e+00,7.878223657608032227e-01,2.086909264326095581e-01,1.372154522687196732e-02,1.914754323661327362e-02,6.322339177131652832e-02,2.483510971069335938e-02,1.306744217872619629e-01,1.917910724878311157e-01,1.045536547899246216e-01,7.588300853967666626e-02,5.636462941765785217e-03,3.048593725907267071e-06,1.007466744340490550e-05,6.312651748885400593e-06,6.210929132066667080e-05,9.079558367375284433e-05,4.959935176884755492e-05,3.630294304457493126e-05,2.697915533644845709e-06,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.517889867957590067e-13,3.006074678069126094e-08,6.895093247294425964e-05,7.250692229717969894e-03,5.352944880723953247e-02,3.269061073660850525e-02,1.587534323334693909e-03,4.743264980788808316e-06,3.112104974764551280e-12,3.715499872214422794e-07,8.522317511960864067e-04,8.961835503578186035e-02,6.616225838661193848e-01,4.040550887584686279e-01,1.962188072502613068e-02,5.862662510480731726e-05,4.459034188978097668e-14,5.323580243299375070e-09,1.221080310642719269e-05,1.284054713323712349e-03,9.479749016463756561e-03,5.789313931018114090e-03,2.811429440043866634e-04,8.400041338063601870e-07,7.406244332554788590e-19,8.842214883463678232e-14,2.028156670386138671e-10,2.132754062245112436e-08,1.574541386162309209e-07,9.615776264126907336e-08,4.669650888189380566e-09,1.395207126914099760e-11,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +3.661684393882751465e-01,6.143768429756164551e-01,1.022689789533615112e-01,1.311270520091056824e-02,1.812545061111450195e-01,3.128204345703125000e-01,1.706557869911193848e-01,5.427592247724533081e-02,2.250721678137779236e-03,9.361813681607600302e-06,3.862059116954696947e-09,1.579519392884420892e-13,6.404242716453858435e-19,2.574200059079758935e-25,1.025811087887202221e-32,0.000000000000000000e+00,4.851471749134361744e-04,2.995575591921806335e-02,1.833678930997848511e-01,1.112764999270439148e-01,6.694531999528408051e-03,3.992759957327507436e-05,2.360827622283068195e-08,1.383862100433341791e-12,8.041902027619125896e-18,4.632989562693864985e-24,2.646029085042773096e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.549920674321256130e-17,6.359852748605288042e-12,7.225059306392722647e-08,8.137166150845587254e-05,9.085377678275108337e-03,1.005655154585838318e-01,1.103549152612686157e-01,1.200525835156440735e-02,1.294758258154615760e-04,1.384340180266008247e-07,1.467339791338950761e-11,1.541910851564248547e-16,1.606291701856487116e-22,1.658894039993423202e-29,1.698498846688573210e-37,0.000000000000000000e+00,5.052537943583956803e-08,1.473136489948956296e-05,4.779852926731109619e-03,3.816230595111846924e-01,2.480590105056762695e+00,1.387516617774963379e+00,7.258814573287963867e-02,1.226632855832576752e-03,2.210800594184547663e-04,1.040218304842710495e-02,1.480644643306732178e-01,1.265548706054687500e+00,2.569314718246459961e+00,1.339639663696289062e+00,8.889946341514587402e-01,1.109277009963989258e-01,4.229936283081769943e-03,1.194990351796150208e-01,3.723362684249877930e-01,3.372000455856323242e-01,2.449283003807067871e-01,1.089636459946632385e-01,1.402255147695541382e-01,3.157134354114532471e-02,1.365936914226040244e-04,5.539643578231334686e-03,2.613341435790061951e-02,2.165525406599044800e-02,2.981700003147125244e-03,6.782454147469252348e-05,6.047190254321321845e-05,1.793725823517888784e-05,2.102087455568835139e-04,6.839178968220949173e-04,7.481456850655376911e-04,7.216211408376693726e-02,6.425914168357849121e-01,4.710989296436309814e-01,2.773487940430641174e-02,1.033013249980285764e-04,1.235211715102195740e-01,4.126861095428466797e-01,1.404621005058288574e-01,1.723424047231674194e-01,1.464076519012451172e+00,1.073267698287963867e+00,6.318470835685729980e-02,2.353314484935253859e-04,8.609651029109954834e-02,3.427273631095886230e-01,2.318287044763565063e-01,3.090672567486763000e-02,4.251501988619565964e-03,2.834756858646869659e-03,1.668673940002918243e-04,6.214809218363370746e-07,8.077842358034104109e-05,6.347875460051000118e-04,9.836419485509395599e-04,1.702796143945306540e-04,2.249523731734370813e-06,1.012972195013617238e-08,5.108867773273573221e-10,1.902618687599222369e-12,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,8.080804358989723823e-10,5.664043101205606945e-07,1.179027021862566471e-04,1.669407705776393414e-03,1.943890936672687531e-03,7.722416776232421398e-04,1.161012216471135616e-03,1.890409475890919566e-04,7.800218736520037055e-05,1.583632896654307842e-03,2.983096614480018616e-02,3.621556758880615234e-01,4.203703403472900391e-01,1.660925894975662231e-01,2.492891699075698853e-01,4.059003293514251709e-02,2.339576184749603271e-02,1.302011907100677490e-01,2.918390631675720215e-01,1.637114882469177246e-01,1.068066656589508057e-01,4.141293838620185852e-02,6.204963475465774536e-02,1.010304037481546402e-02,1.189869362860918045e-02,2.954597026109695435e-02,2.449715882539749146e-02,5.520750768482685089e-03,1.377747394144535065e-04,1.208069807034917176e-05,1.790381247701589018e-05,2.915110826506861486e-06,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,6.696082891721744090e-06,3.809168265433982015e-05,1.801540020096581429e-05,6.670686047982599121e-07,1.457780340885506121e-09,1.018155964269476521e-13,6.543192515750516024e-20,2.375090210265812220e-29,1.278057042509317398e-02,7.270421832799911499e-02,3.438533842563629150e-02,1.273209694772958755e-03,2.782412366286735050e-06,1.943317451402748475e-10,1.248875435947989065e-16,4.533248664569227018e-26,2.827802486717700958e-02,1.608638465404510498e-01,7.608028501272201538e-02,2.817077096551656723e-03,6.156307790661230683e-06,4.299743894264906885e-10,2.763236143856097468e-16,1.003017165984918867e-25,7.253001240314915776e-05,4.125979903619736433e-04,1.951375306816771626e-04,7.225492026918800548e-06,1.579025088460639381e-08,1.102836788904881793e-12,7.087395157737035777e-19,2.572628330763303844e-28,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +8.449827646472840570e-07,5.000164965167641640e-04,2.933410555124282837e-02,1.711743026971817017e-01,1.293096244335174561e-01,2.258939892053604126e-01,3.323161602020263672e-01,1.127931922674179077e-01,9.165338426828384399e-02,3.454490005970001221e-02,1.331746578216552734e-03,5.091104412713320926e-06,1.929480353268786530e-09,7.249406017975287830e-14,2.700283288300195623e-19,9.971114944034498468e-26,1.224779486656188965e-01,2.045542150735855103e-01,3.390118852257728577e-02,5.946150980889797211e-03,8.809801936149597168e-02,1.427424550056457520e-01,2.292881160974502563e-02,3.651297010947018862e-04,5.764345019088068511e-07,9.021729197034034087e-11,1.399787378632906705e-15,2.153157798772458345e-21,3.283424795324738673e-28,4.963722199170885937e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,9.180615989645701802e-11,5.910269464948214591e-07,3.772052295971661806e-04,2.386631816625595093e-02,1.497030258178710938e-01,9.309193491935729980e-02,5.738926585763692856e-03,3.507410656311549246e-05,2.125100095895504637e-08,1.276467104759093640e-12,7.601033786282450865e-18,4.487210039561285056e-24,2.626128435881092097e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.100821794830508793e-10,3.166023887501978606e-08,1.197294295707251877e-06,8.050380529311951250e-06,6.042527729732682928e-06,3.869139106882357737e-07,1.608787214557594325e-09,2.562252168249179451e-13,4.859539330936968327e-06,5.065939621999859810e-04,1.068652234971523285e-02,4.838418960571289062e-02,3.378809988498687744e-02,2.218585694208741188e-03,9.781681910681072623e-06,1.740982913389643727e-09,2.426401479169726372e-03,4.806075617671012878e-02,2.525961399078369141e-01,5.240278840065002441e-01,3.375465273857116699e-01,2.679210342466831207e-02,1.655949308769777417e-04,5.138753778055615840e-08,5.710655823349952698e-03,5.152028799057006836e-02,7.483144104480743408e-02,4.093121364712715149e-02,2.267801761627197266e-02,2.730580745264887810e-03,2.515371488698292524e-05,1.087121326293072343e-08,1.074577495455741882e-02,7.138008624315261841e-02,4.198961332440376282e-02,3.117474261671304703e-03,5.378344212658703327e-05,1.016514730167727976e-07,7.259093499911717373e-12,7.629296893452162714e-18,9.996205568313598633e-02,7.683802247047424316e-01,1.065853476524353027e+00,3.601973652839660645e-01,1.429313980042934418e-02,4.257567707099951804e-05,6.208711322841509173e-09,1.857949490330183806e-14,9.799022972583770752e-02,3.125888705253601074e-01,5.228144526481628418e-01,3.804872632026672363e-01,3.062363713979721069e-02,1.926670956891030073e-04,5.782136014431671356e-08,3.260400304773425351e-13,2.234271727502346039e-02,4.069361463189125061e-02,1.250613480806350708e-02,7.251014932990074158e-03,8.086367743089795113e-04,6.370998562488239259e-06,2.230146067816463074e-09,1.397716933648285656e-14,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.285353275510715321e-07,8.188336323655676097e-06,7.589554297737777233e-05,6.080344974179752171e-05,3.954664862249046564e-06,1.898780510600772686e-08,2.424093217823219959e-11,7.765189790546848936e-15,3.471879055723547935e-03,1.856038346886634827e-02,1.022630855441093445e-01,8.236546069383621216e-02,6.801329553127288818e-03,1.924709649756550789e-04,1.373661348225141410e-06,4.902872552392523176e-10,7.697132974863052368e-02,2.089178413152694702e-01,2.747720479965209961e-01,3.109040558338165283e-01,1.279283463954925537e-01,1.256014965474605560e-02,1.003662109724245965e-04,3.590855968127470987e-08,2.049841918051242828e-03,7.843918167054653168e-03,2.082143351435661316e-02,2.131515368819236755e-02,1.034706458449363708e-02,1.063678995706140995e-03,8.520846677129156888e-06,3.048742147626626320e-09,5.023162811994552612e-04,5.431463010609149933e-03,4.804749041795730591e-03,3.443361492827534676e-04,1.603680743755830918e-06,2.908088769792982475e-10,7.279118980852903025e-16,2.684357187530499939e-24,3.381510078907012939e-02,3.656370937824249268e-01,3.234477639198303223e-01,2.318013831973075867e-02,1.079571302398107946e-04,1.957677397967927391e-08,4.900182161622114452e-14,1.807064753953159248e-22,2.638839650899171829e-03,2.853333950042724609e-02,2.524099685251712799e-02,1.808916102163493633e-03,8.424685802310705185e-06,1.527718951344070319e-09,3.823970897961007087e-15,1.410184951340814521e-23,2.387184281360532623e-07,2.581222815933870152e-06,2.283386493218131363e-06,1.636406921079469612e-07,7.621256403744780528e-10,1.382026410630052271e-13,3.459294137115138327e-19,1.275701232126608839e-27,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.050773775205016136e-03,1.157076936215162277e-02,1.041833218187093735e-02,7.619608659297227859e-04,3.787229843510431238e-06,1.944963967659418813e-09,4.113578509941373529e-13,2.270474089861836580e-18,3.964541852474212646e-02,4.372556805610656738e-01,4.049236178398132324e-01,4.438759386539459229e-02,1.837595482356846333e-03,1.264172078663250431e-05,4.062395753123837494e-09,2.251739173266854854e-14,1.766200759448111057e-03,2.745426446199417114e-02,1.541813164949417114e-01,1.817613691091537476e-01,1.956394314765930176e-02,1.450469862902536988e-04,4.670327413691666152e-08,2.588750611445811423e-13,5.205106958783289883e-07,1.124242335208691657e-04,1.826622174121439457e-03,2.405729610472917557e-03,2.606551279313862324e-04,1.933068688231287524e-06,6.224280535427340055e-10,3.450103048778930918e-15,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +8.449827646472840570e-07,5.000162636861205101e-04,2.933296933770179749e-02,1.706033498048782349e-01,1.011183336377143860e-01,9.160950779914855957e-02,2.824381291866302490e-01,2.038919478654861450e-01,1.463187187910079956e-01,3.645676746964454651e-02,1.260474324226379395e-03,4.593086032400606200e-06,1.674669514173388052e-09,6.061360316661837389e-14,2.175419353553341388e-19,7.740231095211449977e-26,1.227160170674324036e-01,2.044186443090438843e-01,3.379704058170318604e-02,6.588210351765155792e-03,9.246758371591567993e-02,1.404401063919067383e-01,2.114627510309219360e-02,3.156559250783175230e-04,4.671226463415223407e-07,6.853075745771874949e-11,9.967185979898305660e-16,1.437144020341252929e-21,2.054307619655228027e-28,2.911117786515830382e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.214846417907367027e-10,7.331036613322794437e-07,4.385763022582978010e-04,2.601128816604614258e-02,1.529382169246673584e-01,8.914694935083389282e-02,5.151504185050725937e-03,2.951201895484700799e-05,1.676104410819334589e-08,9.437126644376570006e-13,5.267577544195367343e-18,2.914900012144303892e-24,1.599093496744210636e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.677693400869983975e-10,2.979439983619158738e-08,5.303494390318519436e-07,1.245487396772659849e-06,6.388235078702564351e-07,4.586863511235605984e-08,2.421504941008123524e-10,5.212385969892430193e-14,1.006225647870451212e-05,6.649930728599429131e-04,8.115733042359352112e-03,1.758914068341255188e-02,8.992165327072143555e-03,6.467120256274938583e-04,3.414922048250446096e-06,7.350826058960535647e-10,2.936701290309429169e-03,6.067893281579017639e-02,2.425311058759689331e-01,3.186126351356506348e-01,1.497207581996917725e-01,1.065601408481597900e-02,5.601147859124466777e-05,1.203011645856122414e-08,5.883459467440843582e-03,5.425069481134414673e-02,7.875297963619232178e-02,5.335974693298339844e-02,1.520723104476928711e-02,6.153035210445523262e-04,1.952747425093548372e-06,2.901962004031588549e-10,1.074335724115371704e-02,7.097684592008590698e-02,3.958546370267868042e-02,2.089321147650480270e-03,2.081039201584644616e-05,4.225056926543402369e-08,4.339642794420894845e-12,7.869951857784665268e-18,1.089177727699279785e-01,7.326033115386962891e-01,7.440693974494934082e-01,2.279588729143142700e-01,1.027921494096517563e-02,3.576245217118412256e-05,5.683120640753713815e-09,1.509359010118307282e-14,1.274712532758712769e-01,3.937954306602478027e-01,4.131884872913360596e-01,2.332585901021957397e-01,1.475746650248765945e-02,6.722789839841425419e-05,1.301648833162971641e-08,3.824110827803893498e-14,2.201879583299160004e-02,4.287327453494071960e-02,2.693470381200313568e-02,1.002692151814699173e-02,3.988329262938350439e-04,1.010532628242799547e-06,9.887092533578112352e-11,1.570547976719732374e-16,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.171637695866593276e-08,7.794410521455574781e-06,7.976919005159288645e-05,6.693898467347025871e-05,4.568857548292726278e-06,2.373242580233636545e-08,3.706983678353203970e-11,1.321526320042761340e-14,1.395714352838695049e-04,9.973198175430297852e-03,1.018757075071334839e-01,8.727149665355682373e-02,7.674569729715585709e-03,2.450767497066408396e-04,1.905047952277527656e-06,7.439703852973877929e-10,2.833062224090099335e-02,4.792032763361930847e-02,2.384501993656158447e-01,3.150533139705657959e-01,1.361736506223678589e-01,1.440760307013988495e-02,1.241256541106849909e-04,4.857792035295460664e-08,1.243022549897432327e-02,1.493290532380342484e-02,2.052367851138114929e-02,2.055273577570915222e-02,9.910057298839092255e-03,1.088443910703063011e-03,9.395131201017647982e-06,3.677027349269224032e-09,5.032416083849966526e-04,5.648041609674692154e-03,5.179202649742364883e-03,3.853592497762292624e-04,1.872617986009572633e-06,3.579940233144895956e-10,9.647551744504791020e-16,4.020110903653177378e-24,3.252699598670005798e-02,3.650608956813812256e-01,3.347575366497039795e-01,2.490767650306224823e-02,1.210365735460072756e-04,2.313892899508118717e-08,6.235691216854855057e-14,2.598397002618047439e-22,2.437140559777617455e-03,2.735280990600585938e-02,2.508227527141571045e-02,1.866250182501971722e-03,9.068870895134750754e-06,1.733723609120829678e-09,4.672197314637988735e-15,1.946893252411714804e-23,2.116837691801265464e-07,2.375794792897067964e-06,2.178582008127705194e-06,1.620976917138250428e-07,7.876989061017525273e-10,1.505867777478950287e-13,4.058150670124568001e-19,1.691021380175408115e-27,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.049617654643952847e-03,1.198224630206823349e-02,1.117052696645259857e-02,8.472458575852215290e-04,4.398747478262521327e-06,2.435404100609162015e-09,5.442611964411037118e-13,3.178422685376073259e-18,3.802306577563285828e-02,4.347841441631317139e-01,4.173278510570526123e-01,4.791808500885963440e-02,2.083141589537262917e-03,1.484410677221603692e-05,4.970758027411648072e-09,2.915048980195802941e-14,1.626570359803736210e-03,2.624940872192382812e-02,1.525298655033111572e-01,1.851795762777328491e-01,2.054090425372123718e-02,1.575043133925646544e-04,5.284700677066211938e-08,3.099208715183487950e-13,4.483717930270358920e-07,9.978286834666505456e-05,1.671326230280101299e-03,2.266489202156662941e-03,2.530813217163085938e-04,1.941170467034680769e-06,6.513208861136376981e-10,3.819666276523060733e-15,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +1.564984586366335861e-06,9.478062274865806103e-04,5.690814554691314697e-02,3.387554287910461426e-01,2.024294883012771606e-01,9.331712126731872559e-02,2.627687156200408936e-01,8.415484428405761719e-02,3.723994130268692970e-03,2.423056401312351227e-02,5.586163327097892761e-02,1.277182064950466156e-02,2.894870704039931297e-04,6.504889711322903167e-07,1.449083630866709882e-10,3.200198259669284791e-15,1.227772980928421021e-01,2.043836563825607300e-01,3.376668319106101990e-02,6.394255440682172775e-03,9.119898080825805664e-02,1.411287188529968262e-01,2.165119722485542297e-02,3.292954061180353165e-04,4.965087327946093865e-07,7.421722264533414659e-11,1.099804095857455019e-15,1.615725569515167602e-21,2.353191002535981820e-28,3.397615968680381958e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,9.076389645191616148e-35,3.818736975218922269e-27,1.592803316336911332e-20,6.586356673677620441e-15,2.700002443845050948e-10,1.097281028705765493e-06,4.420881741680204868e-04,1.765782572329044342e-02,6.992021203041076660e-02,2.744762413203716278e-02,1.068178913556039333e-03,4.121168331039370969e-06,1.576268338077113640e-09,5.977022262543263409e-14,2.246813829210676053e-19,1.947412556546623819e-06,1.582859549671411514e-04,9.261410450562834740e-04,4.517925844993442297e-04,1.829419124987907708e-05,1.209563720294681843e-07,4.251336782612469278e-10,8.769910118206977745e-14,6.262107053771615028e-04,5.123981460928916931e-02,3.090609908103942871e-01,1.761330515146255493e-01,2.235882170498371124e-02,1.206028508022427559e-03,6.124813808128237724e-06,1.270438310108090718e-09,2.247876720502972603e-03,5.439867451786994934e-02,3.679348826408386230e-01,6.080874800682067871e-01,2.869606614112854004e-01,2.011945284903049469e-02,1.031115243677049875e-04,2.136975574273947132e-08,1.764650689437985420e-03,2.078846283257007599e-02,2.419128455221652985e-02,1.236800383776426315e-02,5.587399937212467194e-03,3.935811982955783606e-04,2.015902509810985066e-06,4.173787704342402094e-10,2.135974727571010590e-02,1.400777250528335571e-01,7.687482237815856934e-02,3.678601700812578201e-03,2.549891905800905079e-05,4.761630023608631745e-08,5.543199579904900531e-12,1.135484227177464448e-17,1.940462738275527954e-01,1.331586837768554688e+00,1.126483321189880371e+00,2.894217967987060547e-01,1.388707663863897324e-02,5.335820605978369713e-05,9.043352733328902104e-09,2.388206684278068592e-14,7.945116609334945679e-02,2.660698890686035156e-01,5.136319994926452637e-01,3.635560870170593262e-01,2.481502480804920197e-02,1.167256195913068950e-04,2.243003471846805041e-08,6.283974805353781390e-14,1.091605611145496368e-02,2.823863551020622253e-02,7.090533617883920670e-03,1.036622212268412113e-03,7.038204057607799768e-05,3.479270844763959758e-07,6.864597085209922511e-11,1.944642989550350305e-16,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.394454568703605762e-14,8.615301397632557645e-13,2.383945905265472121e-12,5.505600315924841226e-13,9.424166498182492968e-15,8.336059033971558279e-18,1.802165107316395335e-22,2.040400449434152416e-29,2.623607109342174226e-08,9.412945018993923441e-07,2.602873337309574708e-06,6.009821049701713491e-07,1.028597296226507751e-08,9.097327925700060547e-12,1.966467719878643413e-16,2.225961632875786205e-23,3.857521369354799390e-05,1.234448049217462540e-03,3.322496777400374413e-03,7.619751268066465855e-04,1.301924021390732378e-05,1.150966078000692505e-08,2.487447639358542073e-13,2.815097249792262978e-20,4.158497322350740433e-04,4.701569676399230957e-03,6.793948821723461151e-03,1.219587866216897964e-03,1.943253846548032016e-05,1.691940099135536002e-08,3.648018031317951104e-13,4.127073232843561582e-20,5.037790979258716106e-04,5.591631866991519928e-03,5.072855856269598007e-03,3.732536279130727053e-04,1.791001182027684990e-06,3.370527190682537366e-10,8.885949481519375345e-16,3.570807680905950504e-24,3.291877731680870056e-02,3.653777837753295898e-01,3.314790725708007812e-01,2.438976429402828217e-02,1.170306131825782359e-04,2.202426330200069060e-08,5.806407465296439807e-14,2.333296824430543450e-22,2.493539592251181602e-03,2.767672576010227203e-02,2.510895766317844391e-02,1.847481704317033291e-03,8.864863048074766994e-06,1.668299387524996291e-09,4.398251189386423801e-15,1.767431340778460723e-23,2.189571972621706664e-07,2.430287622701143846e-06,2.204812517447862774e-06,1.622269962808786659e-07,7.784217714856822568e-10,1.464930200799699489e-13,3.862095423264546455e-19,1.551978001171896649e-27,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.912323271431205285e-09,6.593556811651524185e-09,1.242317804184267516e-09,1.700444646202114996e-11,1.150239571558880902e-14,1.738529825113652278e-19,1.133479259824281791e-26,6.019978202739414137e-38,8.994169911602512002e-05,2.036103396676480770e-04,3.836096584564074874e-05,5.250560661806957796e-07,3.551595961770459553e-10,5.368007775753084326e-15,3.499797183231123295e-22,1.858762197181250345e-33,3.395071486011147499e-03,7.507827132940292358e-03,1.395658706314861774e-03,1.895130299089942127e-05,1.275952321577733528e-08,1.923744231404830862e-13,1.252955353875932966e-20,6.653114060788243607e-32,2.009365241974592209e-03,2.649956848472356796e-03,2.981729630846530199e-04,2.465372062943060882e-06,1.032085750196642948e-09,1.050342792748666307e-14,5.488187864027701457e-22,2.765099565733927731e-33,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +2.145149665011558682e-06,1.169813331216573715e-03,6.371890753507614136e-02,3.467447757720947266e-01,1.898584067821502686e-01,5.244070291519165039e-02,1.406829804182052612e-01,1.422124803066253662e-01,1.638634055852890015e-01,4.140136390924453735e-02,1.394978724420070648e-03,5.148873242433182895e-06,1.934712390294635043e-09,7.254104001513939082e-14,2.700701531497417747e-19,9.971484106286238614e-26,1.217170879244804382e-01,2.049845010042190552e-01,3.426202014088630676e-02,6.526804994791746140e-03,9.197744727134704590e-02,1.407080888748168945e-01,2.134017832577228546e-02,3.208591078873723745e-04,4.782639848599501420e-07,7.067378626768316963e-11,1.035338535824298356e-15,1.503648251069200977e-21,2.164948443100385952e-28,3.090138889374000765e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,9.773824425886222829e-23,9.905299899887334359e-17,9.951873526647947443e-12,9.912393750255432678e-08,9.787928865989670157e-05,9.581632912158966064e-03,9.298745542764663696e-02,8.946361392736434937e-02,8.533080108463764191e-03,8.068675379035994411e-05,7.563675552546555991e-08,7.029154602128384610e-12,6.476061866637677824e-17,5.914932078799977369e-23,5.355942338391718754e-30,4.807833170842403903e-38,1.742921426739485469e-06,1.605762518011033535e-04,1.052256557159125805e-03,5.726912058889865875e-04,2.527000287955161184e-05,1.210792106576263905e-07,3.218664779147673016e-10,7.186341365733595055e-14,5.070479819551110268e-04,4.683013632893562317e-02,3.109800815582275391e-01,1.825240552425384521e-01,1.721634902060031891e-02,8.120231213979423046e-04,4.609187271853443235e-06,1.182114739428641315e-09,8.626772323623299599e-04,5.106640979647636414e-02,3.316590487957000732e-01,3.956968486309051514e-01,2.025309205055236816e-01,1.860279776155948639e-02,1.384253992000594735e-04,5.126756263962306548e-08,2.200993942096829414e-03,2.340571768581867218e-02,5.535979941487312317e-02,3.098005428910255432e-02,1.140912342816591263e-02,1.348600024357438087e-03,1.298853749176487327e-05,6.003112229535645383e-09,2.118363790214061737e-02,1.448064744472503662e-01,8.258881419897079468e-02,3.942628391087055206e-03,2.126234176103025675e-05,3.717485697052325122e-08,5.387499040637733216e-12,1.362828035656641170e-17,1.858592033386230469e-01,1.297747015953063965e+00,1.011908292770385742e+00,2.335535138845443726e-01,1.228410005569458008e-02,5.319548654370009899e-05,9.950463564223355206e-09,2.841347627015669564e-14,6.272388249635696411e-02,2.316572070121765137e-01,5.081040859222412109e-01,3.670932948589324951e-01,2.560620196163654327e-02,1.232114009326323867e-04,2.433527335199414665e-08,7.099464245652331584e-14,1.771290972828865051e-02,3.992307186126708984e-02,1.993890665471553802e-02,2.310091862455010414e-03,8.092456846497952938e-05,3.615455739236494992e-07,7.125395412588275690e-11,2.075522814790940556e-16,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.416103085488673585e-11,4.764656225120234012e-09,1.025139937382846256e-07,2.365236611012733192e-07,1.595361283079910208e-07,2.218774319828753505e-08,2.525181452828206830e-10,1.383685917580312896e-13,7.320263080146105494e-07,1.280341093661263585e-04,2.638203557580709457e-03,6.249844096601009369e-03,4.471486900001764297e-03,6.304103881120681763e-04,7.181675755418837070e-06,3.935389791820398386e-09,1.272682566195726395e-03,1.427450776100158691e-02,9.341271966695785522e-02,1.938446611166000366e-01,1.454896032810211182e-01,2.076574414968490601e-02,2.367719280300661922e-04,1.297500205055257538e-07,1.206887885928153992e-02,3.985174000263214111e-02,3.743653744459152222e-02,1.081533450633287430e-02,5.527384113520383835e-03,7.930275751277804375e-04,9.049104846781119704e-06,4.959027410933458668e-09,4.974490730091929436e-04,5.573784466832876205e-03,5.102954804897308350e-03,3.790531482081860304e-04,1.838505227169662248e-06,3.506498147398673382e-10,9.418706735562728562e-16,3.903552366171794168e-24,3.250756114721298218e-02,3.642385601997375488e-01,3.334705233573913574e-01,2.477056346833705902e-02,1.201435879920609295e-04,2.291444545221565932e-08,6.154985240014107517e-14,2.550913634575494626e-22,2.462573815137147903e-03,2.759248577058315277e-02,2.526168897747993469e-02,1.876466325484216213e-03,9.101344403461553156e-06,1.735858123907974004e-09,4.662640241894118465e-15,1.932416234851279839e-23,2.162542216410656692e-07,2.423071009616251104e-06,2.218388999608578160e-06,1.647844101171358489e-07,7.992467243589373993e-10,1.524367112572255767e-13,4.094560058761855206e-19,1.696977318528425642e-27,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,5.987239148907974595e-08,9.176292223855853081e-06,9.531789692118763924e-05,8.112318027997389436e-05,5.583754045801470056e-06,2.484187078266586468e-08,4.255172169481680200e-12,9.833550418990607249e-18,1.044292584992945194e-04,7.682560943067073822e-03,7.710554450750350952e-02,6.553418189287185669e-02,4.510527942329645157e-03,2.006710928981192410e-05,3.437301998587827256e-09,7.943480908581459360e-15,1.336057670414447784e-02,7.106804847717285156e-02,9.783254563808441162e-02,6.216356530785560608e-02,4.225158598273992538e-03,1.879127921711187810e-05,3.218751487565896241e-09,7.438418879056243188e-15,3.651551436632871628e-03,1.759327203035354614e-02,7.134571671485900879e-03,2.858155348803848028e-04,4.975591309630544856e-06,2.041932489760256431e-08,3.494045330842965313e-12,8.074591378246608997e-18,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +2.169683739339234307e-06,1.180188381113111973e-03,6.407267600297927856e-02,3.473213911056518555e-01,1.977013349533081055e-01,1.490998268127441406e-01,2.439481019973754883e-01,7.850763201713562012e-02,9.086151421070098877e-02,3.350121527910232544e-02,1.244617626070976257e-03,4.584645012073451653e-06,1.674223981673605977e-09,6.061127213194753005e-14,2.175407204338094516e-19,7.740224932235627937e-26,1.216740682721138000e-01,2.050087153911590576e-01,3.428104519844055176e-02,6.411942653357982635e-03,9.121539443731307983e-02,1.411199122667312622e-01,2.164460904896259308e-02,3.291156608611345291e-04,4.961175932294281665e-07,7.414093644575459052e-11,1.098405326824182949e-15,1.613282801768721943e-21,2.349060123546514248e-28,3.390849199289646847e-36,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,3.634744778388022989e-23,4.280371480236504743e-17,4.997178018606440730e-12,5.783686418681099894e-08,6.636254693148657680e-05,7.548801600933074951e-03,8.512730151414871216e-02,9.516933560371398926e-02,1.054781116545200348e-02,1.158950690296478570e-04,1.262414457414706703e-07,1.363258551184687306e-11,1.459454973475900587e-16,1.548943407313092088e-22,1.629781803324687269e-29,1.699994424513577800e-37,1.731137899696477689e-06,1.606520090717822313e-04,1.059954869560897350e-03,5.834102048538625240e-04,2.985446371894795448e-05,2.593702674857922830e-06,2.393040290371573064e-07,1.655482972928723484e-09,4.987560096196830273e-04,4.647280648350715637e-02,3.128270804882049561e-01,2.043759822845458984e-01,4.688976705074310303e-02,1.976030133664608002e-02,1.851256820373237133e-03,1.279900334338890389e-05,8.048366289585828781e-04,4.803264886140823364e-02,3.344334959983825684e-01,5.363329052925109863e-01,4.076711833477020264e-01,1.806550770998001099e-01,1.661269739270210266e-02,1.147112197941169143e-04,2.128873718902468681e-03,2.446295507252216339e-02,6.231457740068435669e-02,2.811571583151817322e-02,5.895172711461782455e-03,1.951331039890646935e-03,1.730009535094723105e-04,1.191846536130469758e-06,2.117658033967018127e-02,1.450847089290618896e-01,8.303512632846832275e-02,5.016938317567110062e-03,6.632940494455397129e-04,3.093415216426365077e-05,9.134403455846040742e-08,9.366112919961810945e-12,1.853664219379425049e-01,1.294243574142456055e+00,1.024223208427429199e+00,4.572608470916748047e-01,1.536648571491241455e-01,6.876872386783361435e-03,2.018656232394278049e-05,2.069016957761959929e-09,6.371038407087326050e-02,2.640452980995178223e-01,5.652135610580444336e-01,4.135868251323699951e-01,6.056407839059829712e-02,1.865840866230428219e-03,5.190350748307537287e-06,5.298868011038848636e-10,1.687041297554969788e-02,3.016768768429756165e-02,1.516131218522787094e-02,2.920288126915693283e-03,1.057730041793547571e-04,8.779528570812544785e-07,1.602762811359070838e-09,1.574782784643374844e-13,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,3.603380788197441120e-11,4.671584008519857889e-09,8.879154478336204193e-08,1.882562088439954096e-07,1.249109402579051675e-07,1.662627546750172769e-08,1.770868174322259847e-10,8.938759021165365581e-14,1.606124169484246522e-05,1.621607661945745349e-04,2.504506846889853477e-03,5.448140203952789307e-03,3.821042133495211601e-03,5.144570022821426392e-04,5.483614131662761793e-06,2.768024476296204739e-09,1.390569098293781281e-02,3.676766902208328247e-02,9.819447994232177734e-02,1.849407851696014404e-01,1.356557309627532959e-01,1.845462992787361145e-02,1.968422875506803393e-04,9.936473333027606714e-08,1.511817518621683121e-02,4.799512773752212524e-02,3.910821303725242615e-02,1.109595596790313721e-02,5.621088203042745590e-03,7.674814551137387753e-04,8.191068445739801973e-06,4.134891984364230666e-09,4.972874885424971581e-04,5.536119919270277023e-03,5.037016700953245163e-03,3.717337094713002443e-04,1.789801103768695612e-06,3.382566449161572564e-10,8.970636894377044361e-16,3.640274772219712804e-24,3.272803500294685364e-02,3.643492460250854492e-01,3.315017223358154297e-01,2.446494996547698975e-02,1.177923768409527838e-04,2.226172135522119788e-08,5.903854878933079142e-14,2.395778142220902975e-22,2.496901433914899826e-03,2.779708988964557648e-02,2.529107220470905304e-02,1.866490463726222515e-03,8.986666216515004635e-06,1.698400864391658160e-09,4.504194682297202670e-15,1.827797186056507165e-23,2.208276583814949845e-07,2.458393510096357204e-06,2.236759655716014095e-06,1.650736862757185008e-07,7.947869029578669142e-10,1.502077271158669403e-13,3.983540012848050596e-19,1.616516395090799019e-27,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,6.279901754169259220e-08,8.722188795218244195e-06,8.289740799227729440e-05,6.473684334196150303e-05,4.072153387824073434e-06,1.635438451330628595e-08,2.465354092748284209e-12,4.760566700308033390e-18,1.042798103298991919e-04,7.946206256747245789e-03,7.343815267086029053e-02,5.728267878293991089e-02,3.603097284212708473e-03,1.447056729375617579e-05,2.181376634879939047e-09,4.212209296367962902e-15,1.281218789517879486e-02,6.779816746711730957e-02,9.866240620613098145e-02,5.946046859025955200e-02,3.696917090564966202e-03,1.484252970840316266e-05,2.237439122865225727e-09,4.320465612741219638e-15,3.856518305838108063e-03,1.811444573104381561e-02,7.172952871769666672e-03,2.840317029040306807e-04,4.764073310070671141e-06,1.766713531026198325e-08,2.660376042726286805e-12,5.137135711089123920e-18,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 +4.409550185386322541e-15,2.291326572922969262e-10,1.200695805891882628e-06,6.471574306488037109e-04,3.720444440841674805e-02,2.405578196048736572e-01,2.078545093536376953e-01,1.944848299026489258e-01,1.295280456542968750e-01,3.403679654002189636e-02,5.594072118401527405e-02,1.277188677340745926e-02,2.894870704039931297e-04,6.504889711322903167e-07,1.449083630866709882e-10,3.200198259669284791e-15,3.974706785925263830e-09,1.031279680319130421e-05,2.652672585099935532e-03,6.764537841081619263e-02,1.716932207345962524e-01,7.249541580677032471e-02,1.276455521583557129e-01,5.359775945544242859e-02,2.249678829684853554e-03,9.361655429529491812e-06,3.862056896508647696e-09,1.579519392884420892e-13,6.404242716453858435e-19,2.574200059079758935e-25,1.025811087887202221e-32,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.105637788772583008e-01,1.236763149499893188e-01,7.201557513326406479e-03,4.157225703238509595e-05,2.379117347572901053e-08,1.349790396641681323e-12,7.591965405227032022e-18,4.233312790633186744e-24,2.340141945071797440e-31,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,4.184652624417140032e-12,5.162287819437949565e-10,5.373590461488220171e-09,4.645168250050346614e-09,3.254602143343277021e-10,1.479330438529380398e-12,2.612862914125633563e-16,6.431335321051542269e-22,1.624505785002838820e-06,6.866081821499392390e-05,6.215541507117450237e-04,5.354839959181845188e-04,3.803578510996885598e-05,1.786427645811272669e-07,3.451919652897039725e-11,1.158947933171470125e-16,2.195138949900865555e-03,2.617890760302543640e-02,1.033109799027442932e-01,8.752840757369995117e-02,7.286062464118003845e-03,4.584039197652600706e-05,1.464663945682787016e-08,1.042608111390813663e-13,5.061258561909198761e-03,4.683332517743110657e-02,7.612138986587524414e-02,5.710859596729278564e-02,6.701234728097915649e-03,6.132467387942597270e-05,2.677393418082374410e-08,2.317527680179010119e-13,4.307794654323515715e-07,1.496448476245859638e-06,8.309029908559750766e-07,2.085038488530699397e-07,7.120498413115683434e-09,1.479711839169617349e-11,9.708280830449372151e-16,5.698524182215059289e-22,5.036871414631605148e-03,1.780658960342407227e-02,1.296001672744750977e-02,3.900653216987848282e-03,1.340624148724600673e-04,2.774728500298806466e-07,1.816390787778843219e-11,1.065145668251569038e-17,1.179602220654487610e-01,3.661015033721923828e-01,3.476971685886383057e-01,1.034353747963905334e-01,3.225647145882248878e-03,6.298993412201525643e-06,4.001635134365244539e-10,2.316215035338232498e-16,3.131984546780586243e-02,8.492603152990341187e-02,6.913109123706817627e-02,1.216004230082035065e-02,2.172829699702560902e-04,2.677939789919037139e-07,1.242260547901219425e-11,6.122132871940224916e-18,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,1.582107870490290225e-05,5.770902498625218868e-04,4.974330775439739227e-03,5.156578961759805679e-03,2.721352968364953995e-03,3.485558263491839170e-04,3.404751169000519440e-06,1.537905802706518443e-09,1.476433500647544861e-02,8.937822282314300537e-02,3.916281461715698242e-01,4.536472558975219727e-01,3.090753257274627686e-01,4.068091139197349548e-02,3.976933658123016357e-04,1.796377091523027048e-07,2.063929662108421326e-02,7.806251943111419678e-02,1.012170761823654175e-01,8.931307494640350342e-02,4.385479167103767395e-02,5.517823155969381332e-03,5.385165059124119580e-05,2.432397927520923986e-08,3.403213850106112659e-05,1.272135850740596652e-04,1.551575987832620740e-04,1.079027206287719309e-04,1.329547194472979754e-05,8.945911531554884277e-07,8.457778477577448939e-09,3.818063920579817250e-12,8.917734106717034592e-09,6.277933550791203743e-08,3.659831904201382713e-08,1.692071927017479993e-09,4.778046881759312470e-12,4.623525636818454163e-16,4.754938497181150100e-22,3.906561283291116691e-31,3.710786113515496254e-04,2.612330485135316849e-03,1.522904029116034508e-03,7.040932541713118553e-05,1.988207998238067375e-07,1.923909642709276113e-11,1.978592202425200671e-17,1.625571462873126710e-26,1.789973489940166473e-02,1.260111033916473389e-01,7.346038520336151123e-02,3.396337851881980896e-03,9.590527042746543884e-06,9.280371471298565211e-10,9.544143844721617899e-16,7.841276411820725820e-25,1.000914257019758224e-03,7.046266924589872360e-03,4.107745364308357239e-03,1.899158232845366001e-04,5.362814476939092856e-07,5.189381563353023807e-11,5.336877660580263683e-17,4.384671027153924872e-26,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,2.356697572395205498e-03,3.595117107033729553e-02,4.465728625655174255e-02,5.113395396620035172e-03,1.067491102730855346e-04,6.236940066628449131e-07,2.195153225859058921e-10,1.400931931902884078e-15,2.730668149888515472e-02,4.226671159267425537e-01,6.312529444694519043e-01,2.212136834859848022e-01,2.016956731677055359e-02,1.600090035935863853e-04,5.708724515329777205e-08,3.643955525777647919e-13,3.733893390744924545e-04,7.619271986186504364e-03,4.292139038443565369e-02,5.182071030139923096e-02,5.979703273624181747e-03,4.821713810088112950e-05,1.721316600367117644e-08,1.098748777508470886e-13,8.227784675796101510e-09,7.990424251147487666e-07,1.270924531127093360e-05,1.788184817996807396e-05,2.088553173962282017e-06,1.685330808243179490e-08,6.016670668629320318e-12,3.840555247202874652e-17,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00,0.000000000000000000e+00 diff --git a/Code/GraphMol/Descriptors/test_data/ethanol.sdf b/Code/GraphMol/Descriptors/test_data/ethanol.sdf new file mode 100644 index 00000000000..9c8ddb80b22 --- /dev/null +++ b/Code/GraphMol/Descriptors/test_data/ethanol.sdf @@ -0,0 +1,110 @@ +702 + -OEChem-06062004443D + + 9 8 0 0 0 0 0 0 0999 V2000 + -1.1712 0.2997 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0463 -0.5665 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2175 0.2668 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0958 -1.2120 0.8819 H 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0952 -1.1938 -0.8946 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.1050 -0.3720 -0.0177 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2426 0.9307 -0.8704 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2616 0.9052 0.8886 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.1291 0.8364 0.8099 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 1 9 1 0 0 0 0 + 2 3 1 0 0 0 0 + 2 4 1 0 0 0 0 + 2 5 1 0 0 0 0 + 3 6 1 0 0 0 0 + 3 7 1 0 0 0 0 + 3 8 1 0 0 0 0 +M END +> +702 + +> +0.4 + +> +1 + +> +3 +1 -0.68 +2 0.28 +9 0.4 + +> +0 + +> +2 +1 1 acceptor +1 1 donor + +> +3 + +> +0 + +> +0 + +> +0 + +> +0 + +> +0 + +> +1 + +> +1 + +> +000002BE00000001 + +> +-1.3096 + +> +10.148 + +> +139733 1 18410856563987595332 +21015797 1 18192151726869919494 + +> +55.87 +1.48 +0.75 +0.58 +0.08 +0.07 +0 +-0.26 +0 +-0.01 +0 +0.04 +0.01 +0 + +> +84.621 + +> +41.5 + +> +2 +5 +10 + +$$$$ diff --git a/Code/GraphMol/ForceFieldHelpers/ANI/ANIForceFieldHelperTest.cpp b/Code/GraphMol/ForceFieldHelpers/ANI/ANIForceFieldHelperTest.cpp new file mode 100644 index 00000000000..a99f3bb5ac2 --- /dev/null +++ b/Code/GraphMol/ForceFieldHelpers/ANI/ANIForceFieldHelperTest.cpp @@ -0,0 +1,80 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include "RDGeneral/test.h" +#include "catch.hpp" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace RDKit; + +TEST_CASE("Check ANI Force Field builder") { + SECTION("ANI-1ccx") { + std::string pathName = getenv("RDBASE"); + std::string filePath = pathName + "/Code/GraphMol/Descriptors/test_data/CH4.mol"; + + auto mol = MolFileToMol(filePath, true, false); + REQUIRE(mol); + int confId = -1; + auto field = RDKit::ANI::constructForceField(*mol, "ANI-1ccx", 8); + field->initialize(); + auto numAtoms = mol->getNumAtoms(); + double *pos; + auto conf = mol->getConformer(confId); + pos = new double[numAtoms * 3]; + for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + auto atom = conf.getAtomPos(i); + pos[3 * i] = atom.x; + pos[3 * i + 1] = atom.y; + pos[3 * i + 2] = atom.z; + } + CHECK(std::fabs(field->calcEnergy(pos) - (-40.0553)) < 0.05); + delete[] pos; + } + SECTION("ANI-1x") { + std::string pathName = getenv("RDBASE"); + std::string filePath = pathName + "/Code/GraphMol/Descriptors/test_data/CH4.mol"; + + auto mol = MolFileToMol(filePath, true, false); + REQUIRE(mol); + int confId = -1; + auto field = RDKit::ANI::constructForceField(*mol, "ANI-1x", 8); + field->initialize(); + auto numAtoms = mol->getNumAtoms(); + double *pos; + auto conf = mol->getConformer(confId); + pos = new double[numAtoms * 3]; + for (unsigned int i = 0; i < mol->getNumAtoms(); i++) { + auto atom = conf.getAtomPos(i); + pos[3 * i] = atom.x; + pos[3 * i + 1] = atom.y; + pos[3 * i + 2] = atom.z; + } + CHECK(std::fabs(field->calcEnergy(pos) - (-40.0517)) < 0.05); + delete[] pos; + } + SECTION("Unsupported Atoms") { + std::string pathName = getenv("RDBASE"); + std::string filePath = pathName + "/Code/GraphMol/Descriptors/test_data/SO2.mol"; + + auto mol = MolFileToMol(filePath, true, false); + REQUIRE(mol); + REQUIRE_THROWS_AS(RDKit::ANI::constructForceField(*mol, "ANI-1x", 8), ValueErrorException); + } +} \ No newline at end of file diff --git a/Code/GraphMol/ForceFieldHelpers/ANI/Builder.cpp b/Code/GraphMol/ForceFieldHelpers/ANI/Builder.cpp new file mode 100644 index 00000000000..f183eada4b4 --- /dev/null +++ b/Code/GraphMol/ForceFieldHelpers/ANI/Builder.cpp @@ -0,0 +1,55 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include +#include +#include +#include +#include + +#include "Builder.h" + +namespace RDKit { +namespace ANI { +using namespace ForceFields::ANI; +namespace Tools { +void addANIContribs(const ROMol &mol, ForceFields::ForceField *field, + std::string modelType, unsigned int numLayers, + unsigned int ensembleSize, int confId) { + PRECONDITION(field, "bad ForceField"); + auto conf = mol.getConformer(confId); + auto numAtoms = mol.getNumAtoms(); + + auto speciesVec = RDKit::Descriptors::ANI::GenerateSpeciesVector(mol); + + for (unsigned int i = 0; i < numAtoms; i++) { + auto atom = conf.getAtomPos(i); + auto ac = new ForceFields::ANI::ANIAtomContrib(field, speciesVec(i), i, + speciesVec, numAtoms, numLayers, + ensembleSize, modelType); + field->contribs().push_back(ForceFields::ContribPtr(ac)); + } +} +} // namespace Tools + +ForceFields::ForceField *constructForceField(ROMol &mol, std::string modelType, + unsigned int ensembleSize, + int confId) { + auto *res = new ForceFields::ForceField(); + Conformer &conf = mol.getConformer(confId); + for (unsigned int i = 0; i < mol.getNumAtoms(); i++) { + res->positions().push_back(&conf.getAtomPos(i)); + } + Tools::addANIContribs(mol, res, modelType, 0, ensembleSize, confId); + return res; +} + +} // namespace ANI +} // namespace RDKit \ No newline at end of file diff --git a/Code/GraphMol/ForceFieldHelpers/ANI/Builder.h b/Code/GraphMol/ForceFieldHelpers/ANI/Builder.h new file mode 100644 index 00000000000..23d0083fe51 --- /dev/null +++ b/Code/GraphMol/ForceFieldHelpers/ANI/Builder.h @@ -0,0 +1,43 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include +#ifndef RD_ANIBUILDER_H_ +#define RD_ANIBUILDER_H_ + +namespace ForceFields { +class ForceField; +} + +namespace RDKit { +class ROMol; +namespace ANI { + +//! Builds and returns an ANI force field for a molecule +/*! + \param mol the molecule to use + \param modelType type of model used + \param ensembleSize number of models in the ensemble + \param confId Conformer ID + + \return the new force field +*/ +RDKIT_FORCEFIELDHELPERS_EXPORT ForceFields::ForceField *constructForceField( + ROMol &mol, std::string modelType, unsigned int ensembleSize, + int confId = -1); +namespace Tools { +RDKIT_FORCEFIELDHELPERS_EXPORT void addANIContribs( + const ROMol &mol, ForceFields::ForceField *field, std::string modelType, + unsigned int numLayers, unsigned int ensembleSize, int confId = -1); +} // namespace Tools +} // namespace ANI +} // namespace RDKit + +#endif \ No newline at end of file diff --git a/Code/GraphMol/ForceFieldHelpers/ANI/CMakeLists.txt b/Code/GraphMol/ForceFieldHelpers/ANI/CMakeLists.txt new file mode 100644 index 00000000000..f8d9a754e23 --- /dev/null +++ b/Code/GraphMol/ForceFieldHelpers/ANI/CMakeLists.txt @@ -0,0 +1,5 @@ +rdkit_catch_test(ANIForceFieldBuilderTest ANIForceFieldHelperTest.cpp catch_main.cpp + LINK_LIBRARIES + DistGeomHelpers ForceFieldHelpers + FileParsers MolTransforms SmilesParse + SubstructMatch MolAlign ANIDescriptors ANIForceField) \ No newline at end of file diff --git a/Code/GraphMol/ForceFieldHelpers/ANI/catch_main.cpp b/Code/GraphMol/ForceFieldHelpers/ANI/catch_main.cpp new file mode 100644 index 00000000000..6f22ebe7e78 --- /dev/null +++ b/Code/GraphMol/ForceFieldHelpers/ANI/catch_main.cpp @@ -0,0 +1,12 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do + // this in one cpp file +#include "catch.hpp" diff --git a/Code/GraphMol/ForceFieldHelpers/CMakeLists.txt b/Code/GraphMol/ForceFieldHelpers/CMakeLists.txt index 4c00cc0cf2f..a3d88b771a7 100644 --- a/Code/GraphMol/ForceFieldHelpers/CMakeLists.txt +++ b/Code/GraphMol/ForceFieldHelpers/CMakeLists.txt @@ -4,8 +4,8 @@ remove_definitions(-DRDKIT_GRAPHMOL_BUILD) add_definitions(-DRDKIT_FORCEFIELDHELPERS_BUILD) rdkit_library(ForceFieldHelpers UFF/AtomTyper.cpp UFF/Builder.cpp MMFF/AtomTyper.cpp MMFF/Builder.cpp CrystalFF/TorsionAngleM6.cpp - CrystalFF/TorsionPreferences.cpp - LINK_LIBRARIES SmilesParse SubstructMatch ForceField) + CrystalFF/TorsionPreferences.cpp ANI/Builder.cpp + LINK_LIBRARIES SmilesParse SubstructMatch ForceField ANIForceField) rdkit_headers(FFConvenience.h DEST GraphMol/ForceFieldHelpers) rdkit_headers(UFF/AtomTyper.h UFF/Builder.h UFF/UFF.h DEST GraphMol/ForceFieldHelpers/UFF) @@ -13,10 +13,12 @@ rdkit_headers(MMFF/AtomTyper.h MMFF/Builder.h MMFF/MMFF.h DEST GraphMol/ForceFieldHelpers/MMFF) rdkit_headers(CrystalFF/TorsionAngleM6.h CrystalFF/TorsionPreferences.h DEST GraphMol/ForceFieldHelpers/CrystalFF) +rdkit_headers(ANI/Builder.h DEST GraphMol/ForceFieldHelpers/ANI) add_subdirectory(MMFF) add_subdirectory(UFF) add_subdirectory(CrystalFF) +add_subdirectory(ANI) if(RDK_BUILD_PYTHON_WRAPPERS) add_subdirectory(Wrap) endif() diff --git a/Code/GraphMol/ForceFieldHelpers/UFF/test_data/CH4.mol b/Code/GraphMol/ForceFieldHelpers/UFF/test_data/CH4.mol new file mode 100644 index 00000000000..70a33822053 --- /dev/null +++ b/Code/GraphMol/ForceFieldHelpers/UFF/test_data/CH4.mol @@ -0,0 +1,14 @@ + + Marvin 06190621052D + + 5 4 0 0 0 0 999 V2000 + 0.0000 1.8250 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8250 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8250 0.0000 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.0000 -1.8250 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4 1 1 0 0 0 0 + 4 2 1 0 0 0 0 + 4 3 1 0 0 0 0 + 4 5 1 0 0 0 0 +M END diff --git a/Code/GraphMol/ForceFieldHelpers/Wrap/rdForceFields.cpp b/Code/GraphMol/ForceFieldHelpers/Wrap/rdForceFields.cpp index 2efabf97c4a..6525a247fa8 100644 --- a/Code/GraphMol/ForceFieldHelpers/Wrap/rdForceFields.cpp +++ b/Code/GraphMol/ForceFieldHelpers/Wrap/rdForceFields.cpp @@ -22,7 +22,7 @@ #include #include #include - +#include namespace python = boost::python; namespace RDKit { @@ -169,6 +169,24 @@ bool MMFFHasAllMoleculeParams(const ROMol &mol) { return mmffMolProperties.isValid(); } + +ForceFields::PyForceField *ANIGetMoleculeForceField(ROMol &mol, + std::string modelType, + unsigned int ensembleSize, + int confId = -1) { + ForceFields::PyForceField *pyFF = nullptr; + boost::python::list result; + + ForceFields::ForceField *ff = + ANI::constructForceField(mol, modelType, ensembleSize, confId); + pyFF = new ForceFields::PyForceField(ff); + + auto x = ff->positions(); + + pyFF->initialize(); + + return pyFF; +} }; // namespace RDKit namespace ForceFields { @@ -481,4 +499,19 @@ RETURNS: a list of (not_converged, energy) 2-tuples. \n\ (python::arg("mol"), python::arg("ff"), python::arg("numThreads") = 1, python::arg("maxIters") = 200), docString.c_str()); + + docString = + "returns an ANI force field for a molecule\n\n\ + \n\ + Arguments:\n\n\ + - mol : the molecule of interest\n\ + - modelType : Type of ANI based model\n\ + - ensembleSize : Number of models inside the ensemble\n\ + - confId : Conformer ID\n\ + \n"; + python::def("ANIGetMoleculeForceField", RDKit::ANIGetMoleculeForceField, + (python::arg("mol"), python::arg("modelType"), + python::arg("ensembleSize"), python::arg("confId") = -1), + python::return_value_policy(), + docString.c_str()); } diff --git a/Code/GraphMol/ForceFieldHelpers/Wrap/testHelpers.py b/Code/GraphMol/ForceFieldHelpers/Wrap/testHelpers.py index d44c61a2736..ca476c47b57 100644 --- a/Code/GraphMol/ForceFieldHelpers/Wrap/testHelpers.py +++ b/Code/GraphMol/ForceFieldHelpers/Wrap/testHelpers.py @@ -350,6 +350,26 @@ def testGitHub2820(self): self.assertEqual(len(res), 2) self.assertEqual(res[0], res[1]) self.assertEqual(res[0], (-1, -1.0)) + + def testANIBuilder(self): + fName = os.path.join(self.dirName, 'CH4.mol') + m = Chem.MolFromMolFile(fName, True, False) + + ff = ChemicalForceFields.ANIGetMoleculeForceField(m, "ANI-1ccx", 8) + self.failUnless(ff) + positions = ff.Positions() + savedPos = list(positions) + e1 = ff.CalcEnergy(savedPos) + + self.failUnless((e1 - (-40.0553)) < 0.05) + + ff1 = ChemicalForceFields.ANIGetMoleculeForceField(m, "ANI-1x", 8) + self.failUnless(ff1) + positions = ff1.Positions() + savedPos = list(positions) + e1 = ff1.CalcEnergy(savedPos) + + self.failUnless((e1 - (-40.0517)) < 0.05) if __name__ == '__main__': unittest.main() diff --git a/Code/Numerics/CMakeLists.txt b/Code/Numerics/CMakeLists.txt index 7c6d7745654..1dcb2007807 100644 --- a/Code/Numerics/CMakeLists.txt +++ b/Code/Numerics/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(Alignment) add_subdirectory(EigenSolvers) add_subdirectory(Optimizer) +add_subdirectory(EigenSerializer) rdkit_headers(Matrix.h SquareMatrix.h diff --git a/Code/Numerics/EigenSerializer/CMakeLists.txt b/Code/Numerics/EigenSerializer/CMakeLists.txt new file mode 100644 index 00000000000..5879742bbc7 --- /dev/null +++ b/Code/Numerics/EigenSerializer/CMakeLists.txt @@ -0,0 +1,13 @@ +if(RDK_USE_BOOST_SERIALIZATION AND Boost_SERIALIZATION_LIBRARY) + set(RDKit_SERIALIZATION_LIBS ${Boost_SERIALIZATION_LIBRARY}) +else() + message("== Making FilterCatalog without boost Serialization support") + set(RDKit_SERIALIZATION_LIBS ) +endif() + +rdkit_library(EigenSerializer EigenSerializer.cpp LINK_LIBRARIES RDGeneral ${RDKit_SERIALIZATION_LIBS}) + +rdkit_headers(EigenSerializer.h EigenBaseAddons.h DEST Numerics/EigenSerializer) +rdkit_catch_test(testEigenSerializer + EigenSerializer_catch.cpp catch_main.cpp + LINK_LIBRARIES RDGeneral ${RDKit_SERIALIZATION_LIBS} EigenSerializer) \ No newline at end of file diff --git a/Code/Numerics/EigenSerializer/EigenBaseAddons.h b/Code/Numerics/EigenSerializer/EigenBaseAddons.h new file mode 100644 index 00000000000..987dd68c657 --- /dev/null +++ b/Code/Numerics/EigenSerializer/EigenBaseAddons.h @@ -0,0 +1,42 @@ +/* + Eigen Matrices do not support boost serialization by default. This file + creates an add on to the Eigen Dense class adding support for serialization to + be able to load and store Eigen matrices from and to boost serialized files. + + https://stackoverflow.com/questions/18382457/eigen-and-boostserialize +*/ + +#ifndef EIGEN_DENSE_BASE_ADDONS_H_ +#define EIGEN_DENSE_BASE_ADDONS_H_ + +friend class boost::serialization::access; +template +void save(Archive& ar, const unsigned int version) const { + derived().eval(); + const Index rows = derived().rows(), cols = derived().cols(); + ar& rows; + ar& cols; + for (Index j = 0; j < cols; ++j) { + for (Index i = 0; i < rows; ++i) { + ar& derived().coeff(i, j); + } + } +} + +template +void load(Archive& ar, const unsigned int version) { + Index rows, cols; + ar& rows; + ar& cols; + if (rows != derived().rows() || cols != derived().cols()) { + derived().resize(rows, cols); + } + ar& boost::serialization::make_array(derived().data(), derived().size()); +} + +template +void serialize(Archive& ar, const unsigned int file_version) { + boost::serialization::split_member(ar, *this, file_version); +} + +#endif \ No newline at end of file diff --git a/Code/Numerics/EigenSerializer/EigenSerializer.cpp b/Code/Numerics/EigenSerializer/EigenSerializer.cpp new file mode 100644 index 00000000000..0cb6b3d6b39 --- /dev/null +++ b/Code/Numerics/EigenSerializer/EigenSerializer.cpp @@ -0,0 +1,203 @@ +// https://stackoverflow.com/questions/18382457/eigen-and-boostserialize +#include +#include +namespace RDNumeric { +namespace EigenSerializer { +template +bool serialize(const T& data, std::ofstream& ofs) { + if (!ofs.is_open()) { + return false; + } + { + boost::archive::binary_oarchive oa(ofs); + oa << data; + } + ofs.close(); + return true; +} + +template +bool serialize(const T& data, const std::string& filename) { + std::ofstream ofs(filename.c_str(), std::ios::out); + return serialize(data, ofs); +} + +template +bool deserialize(T& data, std::ifstream& ifs) { + if (!ifs.is_open()) { + return false; + } + { + boost::archive::binary_iarchive ia(ifs); + ia >> data; + } + ifs.close(); + return true; +} + +template +bool deserialize(T& data, const std::string& filename) { + std::ifstream ifs(filename.c_str(), std::ios::in); + return deserialize(data, ifs); +} + +template +bool deserializeAll(std::vector* weights, std::vector* biases, + std::string& filename, std::string atomType) { + PRECONDITION(weights != nullptr, "Weights Array is NULL"); + PRECONDITION(biases != nullptr, "Biases Array is NULL"); + std::ifstream ifs(filename.c_str(), std::ios::in); + return deserializeAll(weights, biases, ifs, atomType); +} + +template +bool deserializeAll(std::vector* weights, std::vector* biases, + std::ifstream& ifs, std::string atomType) { + PRECONDITION(weights != nullptr, "Weights Array is NULL"); + PRECONDITION(biases != nullptr, "Biases Array is NULL"); + if (!ifs.is_open()) { + return false; + } + { + boost::archive::binary_iarchive ia(ifs); + + std::streampos archiveOffset = ifs.tellg(); + std::streampos streamEnd = ifs.seekg(0, std::ios_base::end).tellg(); + ifs.seekg(archiveOffset); + while (ifs.tellg() < streamEnd) { + std::string weightType; + T weight; + ia >> weightType; + ia >> weight; + if (weightType.find(atomType) != std::string::npos) { + if (weightType.find("bias") != std::string::npos) { + biases->push_back(weight); + } + if (weightType.find("weight") != std::string::npos) { + weights->push_back(weight); + } + } + } + } + ifs.close(); + return true; +} + +template +bool serializeAll( + std::vector>>>* + weightsAndBiasesForEachAtomType, + std::ofstream& ofs) { + PRECONDITION(weightsAndBiasesForEachAtomType != nullptr, + "Array of Weights and Biases is NULL"); + if (!ofs.is_open()) { + return false; + } + { + boost::archive::binary_oarchive oa(ofs); + for (unsigned int i = 0; i < weightsAndBiasesForEachAtomType->size(); i++) { + auto atomType = (*weightsAndBiasesForEachAtomType)[i].first; + auto weights = (*weightsAndBiasesForEachAtomType)[i].second; + for (unsigned int j = 0; j < weights.size(); j++) { + std::string identifier = + atomType + "_" + std::to_string(j / 2) + "_" + weights[j].first; + oa << identifier; + oa << weights[j].second; + } + } + } + return true; +} + +template +bool serializeAll( + std::vector>>>* + weightsAndBiasesForEachAtomType, + const std::string& fileName) { + std::ofstream ofs(fileName.c_str(), std::ios::out); + return serializeAll(weightsAndBiasesForEachAtomType, ofs); +} + +template bool serialize(const Eigen::ArrayXXd&, + const std::string&); +template bool serialize(const Eigen::MatrixXd&, + const std::string&); +template bool serialize(const Eigen::ArrayXXf&, + const std::string&); +template bool serialize(const Eigen::ArrayXd&, + const std::string&); +template bool serialize(const Eigen::MatrixXf&, + const std::string&); + +template bool deserialize(Eigen::ArrayXXd&, + const std::string&); +template bool deserialize(Eigen::MatrixXd&, + const std::string&); +template bool deserialize(Eigen::ArrayXXf&, + const std::string&); +template bool deserialize(Eigen::ArrayXd&, const std::string&); +template bool deserialize(Eigen::MatrixXf&, + const std::string&); + +template bool deserializeAll(std::vector*, + std::vector*, + std::string&, std::string); +template bool deserializeAll(std::vector*, + std::vector*, + std::string&, std::string); +template bool deserializeAll(std::vector*, + std::vector*, + std::string&, std::string); +template bool deserializeAll(std::vector*, + std::vector*, + std::string&, std::string); + +template bool deserializeAll(std::vector*, + std::vector*, + std::ifstream&, std::string); +template bool deserializeAll(std::vector*, + std::vector*, + std::ifstream&, std::string); +template bool deserializeAll(std::vector*, + std::vector*, + std::ifstream&, std::string); +template bool deserializeAll(std::vector*, + std::vector*, + std::ifstream&, std::string); + +template bool serializeAll( + std::vector>>>*, + const std::string&); +template bool serializeAll( + std::vector>>>*, + const std::string&); +template bool serializeAll( + std::vector>>>*, + const std::string&); +template bool serializeAll( + std::vector>>>*, + const std::string&); + +template bool serializeAll( + std::vector>>>*, + std::ofstream&); +template bool serializeAll( + std::vector>>>*, + std::ofstream&); +template bool serializeAll( + std::vector>>>*, + std::ofstream&); +template bool serializeAll( + std::vector>>>*, + std::ofstream&); + +} // namespace EigenSerializer +} // namespace RDNumeric \ No newline at end of file diff --git a/Code/Numerics/EigenSerializer/EigenSerializer.h b/Code/Numerics/EigenSerializer/EigenSerializer.h new file mode 100644 index 00000000000..a57750fcfbc --- /dev/null +++ b/Code/Numerics/EigenSerializer/EigenSerializer.h @@ -0,0 +1,76 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// +// https://stackoverflow.com/questions/18382457/eigen-and-boostserialize +#ifndef EIGEN_CONFIG_H_ +#define EIGEN_CONFIG_H_ + +#include + +#include +#include +#define EIGEN_DENSEBASE_PLUGIN "Numerics/EigenSerializer/EigenBaseAddons.h" +#include +#endif + +#include + +namespace RDNumeric { +namespace EigenSerializer { + +template +bool serialize(const T& data, const std::string& filename); + +template +bool serialize(const T& data, const std::ofstream& ofs); + +template +bool deserialize(T& data, const std::string& filename); + +template +bool deserialize(T& data, const std::ifstream& ifs); + +template +bool deserializeAll(std::vector* weights, std::vector* biases, + std::string& filename, std::string atomType); + +template +bool deserializeAll(std::vector* weights, std::vector* biases, + std::ifstream& ifs, std::string atomType); + +template +bool serializeAll( + std::vector>>>* + weightsAndBiasesForEachAtomType, + std::ofstream& ofs); + +/*! + Stores boost serialized eigen matrix in "fileName" + \param weightsAndBiasesForEachAtomType formatted as follows + H : "weight" -> ArrayXXd/ArrayXXf + "bias" -> ArrayXXd/ArrayXXf + "weight" -> ArrayXXd/ArrayXXf + "bias" -> ArrayXXd/ArrayXXf + (in order of layers of NN) + O : "weight" -> ArrayXXd/ArrayXXf + "bias" -> ArrayXXd/ArrayXXf + "weight" -> ArrayXXd/ArrayXXf + "bias" -> ArrayXXd/ArrayXXf + and so on for different atom types + \param fileName File in which the the first argument is stored + \return true/false if values were stored or not +*/ + +template +bool serializeAll( + std::vector>>>* + weightsAndBiasesForEachAtomType, + const std::string& fileName); +} // namespace EigenSerializer +} // namespace RDNumeric \ No newline at end of file diff --git a/Code/Numerics/EigenSerializer/EigenSerializer_catch.cpp b/Code/Numerics/EigenSerializer/EigenSerializer_catch.cpp new file mode 100644 index 00000000000..c808076214c --- /dev/null +++ b/Code/Numerics/EigenSerializer/EigenSerializer_catch.cpp @@ -0,0 +1,85 @@ +// +// Copyright (C) 2020 Manan Goel +// +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#include "RDGeneral/test.h" +#include "catch.hpp" + +#include +#include + +TEST_CASE("Eigen Matrix Serialization Test") { + SECTION("Test 1") { + Eigen::ArrayXXd J(10, 5); + J.setRandom(); + RDNumeric::EigenSerializer::serialize(J, "matrix.bin"); + + Eigen::ArrayXXd JCopy; + RDNumeric::EigenSerializer::deserialize(JCopy, "matrix.bin"); + + CHECK(J.isApprox(JCopy)); + } + SECTION("Test serializeAll and deserializeAll") { + unsigned int numModels = 5; + for (unsigned int i = 0; i < numModels; i++) { + std::string fileName = "./model" + std::to_string(i); + std::vector atomTypes = {"H", "C", "N", "O"}; + std::vector>>> + weightsAndBiasesForEachAtomType; + + for (unsigned int j = 0; j < atomTypes.size(); j++) { + unsigned int numLayers = 4; + std::vector> weights; + for (unsigned int k = 0; k < numLayers; k++) { + std::string weightType = "weight"; + weights.push_back( + std::make_pair(weightType, Eigen::ArrayXXd::Random(10, 10))); + std::string biasType = "bias"; + weights.push_back( + std::make_pair(biasType, Eigen::ArrayXXd::Random(10, 1))); + } + weightsAndBiasesForEachAtomType.push_back( + std::make_pair(atomTypes[j], weights)); + } + RDNumeric::EigenSerializer::serializeAll(&weightsAndBiasesForEachAtomType, + fileName); + + std::vector>>> + weightsAndBiasesForEachAtomTypeCopy; + for (unsigned int j = 0; j < atomTypes.size(); j++) { + std::vector> weightsWithType; + std::vector weights, biases; + RDNumeric::EigenSerializer::deserializeAll(&weights, &biases, fileName, + atomTypes[j]); + for (unsigned int k = 0; k < weights.size(); k++) { + weightsWithType.push_back(std::make_pair("weight", weights[k])); + weightsWithType.push_back(std::make_pair("bias", biases[k])); + } + weightsAndBiasesForEachAtomTypeCopy.push_back( + std::make_pair(atomTypes[j], weightsWithType)); + } + CHECK(weightsAndBiasesForEachAtomType.size() == + weightsAndBiasesForEachAtomTypeCopy.size()); + for (unsigned int i = 0; i < weightsAndBiasesForEachAtomType.size(); + i++) { + CHECK(weightsAndBiasesForEachAtomType[i].first == + weightsAndBiasesForEachAtomTypeCopy[i].first); + auto groundTruthWeights = weightsAndBiasesForEachAtomType[i].second; + auto readWeights = weightsAndBiasesForEachAtomTypeCopy[i].second; + CHECK(groundTruthWeights.size() == readWeights.size()); + for (unsigned int j = 0; j < groundTruthWeights.size(); j++) { + CHECK(groundTruthWeights[j].first == readWeights[j].first); + CHECK(groundTruthWeights[j].second.isApprox(readWeights[j].second)); + } + } + } + } +} \ No newline at end of file diff --git a/Code/Numerics/EigenSerializer/catch_main.cpp b/Code/Numerics/EigenSerializer/catch_main.cpp new file mode 100644 index 00000000000..6f22ebe7e78 --- /dev/null +++ b/Code/Numerics/EigenSerializer/catch_main.cpp @@ -0,0 +1,12 @@ +// +// Copyright (C) 2020 Manan Goel +// @@ All Rights Reserved @@ +// This file is part of the RDKit. +// The contents are covered by the terms of the BSD license +// which is included in the file license.txt, found at the root +// of the RDKit source tree. +// + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do + // this in one cpp file +#include "catch.hpp"