Package: gridrdf
gridrdfGrouped representation of interatomic distances (GRID)This package is designed to compute GRID descriptions of
crystal structures and use them to train ML models, currently
based on properties extracted from the Materials Project.
In addition, it contains a number of tools for computing
earth mover’s distance (EMD) between distributions such
as GRID or RDF, and using the resulting dissimilarities for
further calculations.This code accompanies the following paper. We appreciate if
you could cite any use of this code or method.Grouped Representation of Interatomic Distances as a Similarity Measure for Crystal StructuresInstallationThe latest stable version of gridrdf can be installed using pip:pipinstallgridrdfIf you are using conda, you may find it easier to create a new environment with the
required dependencies first, before installing gridrdf using pip:condacreate-ngridrdf_env-fenvironment.ymlcondaactivategridrdf_envpipinstallgridrdfAlternatively, the most recent development version can be installed
by cloning the git repository, and then installing in ‘development’ mode:gitclonehttps://git.ecdf.ed.ac.uk/funcmatgroup/gridrdf.gitpipinstall-egridrdf/Using conda with this approach, you can install the dependencies from requirements.txt:gitclonehttps://git.ecdf.ed.ac.uk/funcmatgroup/gridrdf.gitcondaenvcreate-ngridrdf_env--filegridrdf/requirements.txt-cdefaults-cconda-forgecondaactivategridrdf_envpipinstall-egridrdfTestingOnce downloaded or installed, it is recommended to test the code operates
correctly. Using a python terminal, navigate to thegridrdfdirectory and typepython-munittestdiscover-stestsUsing the CodeAll modules contained in gridrdf have documentation describing their
intended use, and are grouped into ‘data preparation’ (gridrdf.data_prepare),
‘similarity calculation’ (gridrdf.earth_mover_distance) and ‘model training’ (gridrdf.train) steps.
Other utility modules are also included.Submodules of gridrdf can be imported and used interactively in a python environment, but the main steps
outlined above can also be accessed as command line scripts by calling the module directly (–help will give
more details of usage):python-mgridrdf.MODULE_NAME--helpIntended WorkflowTo re-create the results presented in the publication of predicting
bulk modulus  using a kNN model and EMD dissimilarity, the procedure is as follows:Import data from the materials project with calculated elastic modulidata=gridrdf.data_prepare.get_MP_bulk_modulus_data(APIkey)withopen('MP_modulus.json')asf:gridrdf.json.dumps(data,f)NOTE: gridrdf currently relies on the legacy Materials Project API, so needs an old API KEYCalculate GRID representation for each structure (up to a number of GRID shells) and save to files.gridrdf.data_prepare.batch_rdf(data,num_neighbours=100,bin_size=0.1,method='kde',output_dir='./GRIDS',normalize=True)or from a terminal:python-mgridrdf.data_prepare--data_sourceMP_modulus.json--output_dir../GRIDS/--tasksgrid_rdf_kdeFilter structure with negative bulk modulifordindata:ifd['elasticity.K_VRH']<0:data.remove(d)or from a terminal:python-mgridrdf.data_prepare--data_sourceMP_modulus.json--output_dir./GRIDS/--output_fileMP_subset.json--taskssubset_property--prop_filterelasticity.K_VRH0np.infFilter elements with atomic number > Bi:# First, generate internal list of 78 elements (as gridrdf.composition.periodic_table_78)gridrdf.composition.element_indice()data=gridrdf.data_prepare.elements_selection(data,gridrdf.composition.periodic_table_78,mode='consist')NOTE: not currently implemented for command line scriptSteps 2-4 can be combined into a single function call (similarly through terminal script by specifying tasks in order):data_quick=gridrdf.data_prepare.main(data_source='./MP_modulus.json',tasks=['subset_grid_len','subset_composition','subset_property'],output_dir='./GRIDS',output_file='subset.json',max_dist=10,min_grid_groups=100,composition={'elem':gridrdf.composition.periodic_table_78,'type':'consist'},data_property=('elasticity.K_VRH',0,np.inf))Calculate pair-wise dissimilarity matrix between structures using EMD (time-consuming)similarity=gridrdf.earth_mover_distance.rdf_similarity_matrix(data,all_GRID,method='emd')similarity.to_csv('GRID_sim_whole_matrix.csv')or from a terminal:python-mgridrdf.earth_mover_distance--input_fileMP_modulus.json--rdf_dir./GRIDS/--output_fileGRID_sim--taskrdf_similarity_matrixUse a simplified kNN model to predict bulk modulusK_data=np.array([x['elasticity.K_VRH']forxindata])model=sklearn.neighbors.KNeighborsRegressor(n_neighbors=1,metric='precomputed')gridrdf.train.calc_obs_vs_pred_2D(funct=model,X_data=similarity,y_data=K_data,test_size=0.2,outdir='./',)or from a terminal:python-mgridrdf.train--input_fileMP_modulus.json--rdf_dir./GRIDS/--input_featuresdistance_matrix--dist_matrixGRID_sim_whole_matrix.csv--out_dir./--functknn_reg--targetbulk_modulus--metricsemd--taskobs_vs_predIssuesIf you have any questions, comments or problems with the code, please feel free to post them as issueshereNoteThis project has been set up using PyScaffold 4.3.1. For details and usage
information on PyScaffold seehttps://pyscaffold.org/.