UF3: a python library for generating ultra-fast interatomic potentials

Overview

Ultra-Fast Force Fields (UF3)

Tests

S. R. Xie, M. Rupp, and R. G. Hennig, "Ultra-fast interpretable machine-learning potentials", preprint arXiv:2110.00624 (2021).

All-atom dynamics simulations have become an indispensable quantitative tool in physics, chemistry, and materials science, but large systems and long simulation times remain challenging due to the trade-off between computational efficiency and predictive accuracy. The UF3 framework is built to address this challenge by combinining effective two- and three-body potentials in a cubic B-spline basis with regularized linear regression to obtain machine-learning potentials that are physically interpretable, sufficiently accurate for applications, and as fast as the fastest traditional empirical potentials.

Documentation: https://uf3.readthedocs.io/

This repository is still under construction. Please feel free to open new issues for feature requests and bug reports.

Setup

conda create --name uf3_env python=3.7
conda activate uf3_env
git clone https://github.com/uf3/uf3.git
cd uf3
pip install wheel
pip install -r requirements.txt
pip install numba
pip install -e .

Getting Started

Please see the examples in uf3/examples/tungsten_extxyz for basic usage.

Overviews for individual modules can be found in uf3/examples/modules (WIP).

Standalone scripts and configuration generators/parsers are in development.

Optional Dependencies

Elastic constants:

pip install setuptools_scm
pip install "elastic>=5.1.0.17"

Phonon spectra:

pip install spglib
pip install seekpath
pip install "phonopy>=2.6.0"

LAMMPS interface:

conda install numpy==1.20.3 --force-reinstall
conda install -c conda-forge lammps --no-update-deps

Dependencies

  • We rely on ase to handle parsing outputs from atomistic codes like LAMMPS, VASP, and C2PK.
  • We use Pandas to keep track of atomic configurations and their energies/forces as well as organizing data for featurization and training.
  • B-spline evaluations use scipy, numba, and ndsplines.
  • PyTables is used for reading/writing HDF5 files.
Comments
  • uf3 with VASP

    uf3 with VASP

    Hi, Stephen, I heard about this project in Prof. Hennig's talk yesterday. I'm wondering is the present version able to train the uf3 potentials with the VASP's forces and energies data? Thank you very much!

    Yuewen

    opened by yw-fang 6
  • Unreasonable spline curves

    Unreasonable spline curves

    Hi, I am trying to fit a UF2 model for SiC, based on Formation energies and forces, the dataset generated by annealing MD calculation 200~ snapshot configurations. Here is the splines curve I got for 5/200, 20/200, 40/200, and 80/200 training datasets, respectively. image image image image

    Where, ridge_1b=1e-6, curvature_2b=1e-4, batch_size=5, weight=0.5

    Besides, I also tested smaller curvature_2b values, eg. 1e-2, even 1e-1, unfortunately, as shown below (Training:80/200, curvature_2b=1e-1, batch_size=5), it's also the same case. I would appreciate it if you have any clue about that!! image

    However, the prediction looks perfect, I kinda confused by this. image image

    opened by MengnanCui 6
  • Multicomponent three-body contributions wrong with PBC

    Multicomponent three-body contributions wrong with PBC

    Problem description

    When calculating three-body energy and force contributions, results change depending on whether interactions are computed across periodic boundaries or not.

    To reproduce, I have created a 10x10x10 cell with four atoms. When the atoms are placed in the middle of the cell, such that activating or deactivating PBC does not change results, contributions are computed correctly. However, if atoms are moved towards a boundary and one atom moves to the top of the box (no atoms have positions outside the box), contributions are incorrect, possibly added multiple times.

    The potential file only contains coefficients for three-body, one- and two-body coefficients are 0. All coefficients for three-body contributions are the same.

    Potential file: https://pastebin.com/bfD8R0Rb

    Atoms in middle of cell (test_m.data)
    
    4    atoms 
    2  atom types
    0.0      10  xlo xhi
    0.0      10  ylo yhi
    0.0      10  zlo zhi
    
    Atoms 
    
       1   2      0 4 5
       2   1      0 4 6
       3   2      0 5 5
       4   1      0 4 4
       
    
    Atoms close boundary (test_b.data)
    
    4    atoms 
    2  atom types
    0.0      10  xlo xhi
    0.0      10  ylo yhi
    0.0      10  zlo zhi
    
    Atoms 
    
       1   2      0 4 0.5
       2   1      0 4 1.5
       3   2      0 5 0.5
       4   1      0 4 9.5
            
    

    To reproduce the problem, use the files above and run:

    # Imports
    from uf3.representation import bspline
    from uf3.representation import process
    from uf3.util import json_io
    from uf3.regression import least_squares
    from uf3.forcefield import calculator
    from uf3.forcefield import lammps
    from uf3.util import plotting
    from uf3.data import io
    from uf3.data import composition
    import ase
    
    model = least_squares.WeightedLinearModel.from_json("model.json")
    calc = calculator.UFCalculator(model)
    
    test = ase.io.lammpsdata.read_lammps_data("test_m.data", style="atomic")
    test.symbols = "OZrOZr"
    test.pbc=True
    test.wrap()
    test.set_calculator(calc)
    print(test.get_potential_energy())
    
    test = ase.io.lammpsdata.read_lammps_data("test_b.data", style="atomic")
    test.symbols = "OZrOZr"
    test.pbc=True
    test.wrap()
    test.set_calculator(calc)
    print(test.get_potential_energy())
    
    

    The energies should match, since the atoms are simply moved by 5 units in z-direction, but don't:

    -43168.42282486064
    -37056.21139709316
    

    While this only demonstrates the issue for the UFCalculator, it could potentially affect training if the same issue occurs when generating supercells there.

    Possible causes could be symmetries, there was a fix that ensures symmetry when j and k are switched, or interactions that select the wrong central atom, but those are a shot in the dark.

    opened by henk789 1
  • Model coefficients after loading models incorrect

    Model coefficients after loading models incorrect

    Problem description

    After loading a model from a json file, the model's performance is significantly decreased:

    | | MAE Energies | MAE Forces | RMSE Energies | RMSE Forces | |----------------------|--------------|------------|---------------|-------------| | Model after training | 0.005 | 0.184 | 0.006 | 0.250 | | Model after loading | 0.026 | 0.245 | 0.027 | 0.317 |

    This behavior appears to be because of the compress_3B and decompress_3B methods in bspline.py.

    Decompressing coefficients from a model and compressing them again results in different arrays of coefficients and cause different results after loading.

    Solution

    Changing the decompress method to work correctly results in wrong coefficients for the UFCalculator and the LAMMPS implementation. A possible fix could, therefore, be a distinction between loading coefficients that had flat_weights applied to them during decompressing and multiplying all coefficients by 0.5 and applying the flat_weights in all other cases when compressing coefficients.

    This results in correct model loading, but I cannot assess possible side effects, so input on this is appreciated.

    opened by henk789 1
  • Training with a Single Image

    Training with a Single Image

    When training with a single image in the database, we get an error because the standard deviation is 0. While training with a single image is rare, I believe this should be considered a base case.

    opened by EboniWilliams 1
  • Implementation of Custom Knot Strategy is Broken

    Implementation of Custom Knot Strategy is Broken

    "Custom" is an option for knot strategy. However, its implementation is currently broken. That is, it will result in an error when used. The problem seems to be that it has "pass" on the get_spacer function so we get the following error: UnboundLocalError: local variable 'spacing_function' referenced before assignment

    opened by EboniWilliams 1
  • WeightedLinearModel.save JSON precision too small

    WeightedLinearModel.save JSON precision too small

    Problem description

    When exporting a trained model using WeightedLinearModel.save, floats are formatted using Python's format with the "g" parameter that has a default precision of 6.

    The class that handles this is CompactJSONEncoder:

    https://github.com/uf3/uf3/blob/f2ad1a23f5b38695894378803dc54f25139b1a3d/uf3/util/json_io.py#L138-L140

    For a model I trained, this precision is too small, resulting in prediction errors when loading the model from the .json file.

    Example

    I attached the solutions of the model here. The first output shows the solutions directly after training, and the second output shows the solutions after saving and loading.

    Solutions after training
    {'solution': {'Zr': -20560.33609234794,
    'O': -41120.412798809746,
    ('O',
     'O'): array([ 5.26435439e+00,  5.20311465e+00,  5.08063516e+00,  4.89691593e+00,
            4.65195696e+00,  4.34575824e+00,  3.97831977e+00,  3.54964157e+00,
            3.05972362e+00,  2.50856592e+00,  1.89616849e+00,  1.22868659e+00,
            7.30053245e-01,  4.31556715e-01,  2.46165334e-01,  1.24437004e-01,
            5.93001720e-02,  2.74566934e-02,  1.30984740e-02,  3.16545758e-03,
            8.15071387e-04,  1.64258524e-04, -6.46071392e-03, -9.32398478e-03,
           -1.06880467e-02,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00]),
    ('Zr',
     'O'): array([ 2.57773141,  2.48379049,  2.29590865,  2.01408589,  1.63832222,
            1.16861763,  0.60497211, -0.05261432, -0.80414166, -1.64960993,
           -2.08524704, -1.9352091 , -1.61253899, -1.27462536, -0.97011593,
           -0.72222357, -0.53059997, -0.37511157, -0.26761948, -0.19630742,
           -0.1364386 , -0.08911125, -0.05464061, -0.02995521, -0.0185196 ,
            0.        ,  0.        ,  0.        ]),
    ('Zr',
     'Zr'): array([7.63423726, 7.59087987, 7.50416508, 7.37409289, 7.20066331,
           6.98387633, 6.72373196, 6.42023019, 6.07337103, 5.68315447,
           5.24958052, 4.77264917, 4.25236043, 3.68871429, 3.08171076,
           2.43142205, 1.77394657, 1.3332101 , 0.99423793, 0.73174477,
           0.51741219, 0.35220643, 0.2297151 , 0.13608243, 0.05597425,
           0.        , 0.        , 0.        ])},
    'knots': {('O',
     'O'): array([1.0e-06, 1.0e-06, 1.0e-06, 1.0e-06, 2.0e-01, 4.0e-01, 6.0e-01,
           8.0e-01, 1.0e+00, 1.2e+00, 1.4e+00, 1.6e+00, 1.8e+00, 2.0e+00,
           2.2e+00, 2.4e+00, 2.6e+00, 2.8e+00, 3.0e+00, 3.2e+00, 3.4e+00,
           3.6e+00, 3.8e+00, 4.0e+00, 4.2e+00, 4.4e+00, 4.6e+00, 4.8e+00,
           5.0e+00, 5.0e+00, 5.0e+00, 5.0e+00]),
    ('Zr',
     'O'): array([1.0e-06, 1.0e-06, 1.0e-06, 1.0e-06, 2.0e-01, 4.0e-01, 6.0e-01,
           8.0e-01, 1.0e+00, 1.2e+00, 1.4e+00, 1.6e+00, 1.8e+00, 2.0e+00,
           2.2e+00, 2.4e+00, 2.6e+00, 2.8e+00, 3.0e+00, 3.2e+00, 3.4e+00,
           3.6e+00, 3.8e+00, 4.0e+00, 4.2e+00, 4.4e+00, 4.6e+00, 4.8e+00,
           5.0e+00, 5.0e+00, 5.0e+00, 5.0e+00]),
    ('Zr',
     'Zr'): array([1.0e-06, 1.0e-06, 1.0e-06, 1.0e-06, 2.0e-01, 4.0e-01, 6.0e-01,
           8.0e-01, 1.0e+00, 1.2e+00, 1.4e+00, 1.6e+00, 1.8e+00, 2.0e+00,
           2.2e+00, 2.4e+00, 2.6e+00, 2.8e+00, 3.0e+00, 3.2e+00, 3.4e+00,
           3.6e+00, 3.8e+00, 4.0e+00, 4.2e+00, 4.4e+00, 4.6e+00, 4.8e+00,
           5.0e+00, 5.0e+00, 5.0e+00, 5.0e+00])}}
    
    Solutions after saving and loading
    {'solution': {'Zr': -20560.3,
     'O': -41120.4,
     ('O',
      'O'): array([ 5.26435e+00,  5.20311e+00,  5.08064e+00,  4.89692e+00,
             4.65196e+00,  4.34576e+00,  3.97832e+00,  3.54964e+00,
             3.05972e+00,  2.50857e+00,  1.89617e+00,  1.22869e+00,
             7.30053e-01,  4.31557e-01,  2.46165e-01,  1.24437e-01,
             5.93001e-02,  2.74567e-02,  1.30984e-02,  3.16543e-03,
             8.15054e-04,  1.64246e-04, -6.46072e-03, -9.32399e-03,
            -1.06880e-02,  0.00000e+00,  0.00000e+00,  0.00000e+00]),
     ('Zr',
      'O'): array([ 2.57773  ,  2.48379  ,  2.29591  ,  2.01409  ,  1.63832  ,
             1.16862  ,  0.604972 , -0.0526146, -0.804142 , -1.64961  ,
            -2.08525  , -1.93521  , -1.61254  , -1.27463  , -0.970116 ,
            -0.722224 , -0.5306   , -0.375112 , -0.26762  , -0.196307 ,
            -0.136439 , -0.0891113, -0.0546406, -0.0299552, -0.0185196,
             0.       ,  0.       ,  0.       ]),
     ('Zr',
      'Zr'): array([7.63424  , 7.59088  , 7.50417  , 7.37409  , 7.20066  , 6.98388  ,
            6.72373  , 6.42023  , 6.07337  , 5.68316  , 5.24958  , 4.77265  ,
            4.25236  , 3.68872  , 3.08171  , 2.43142  , 1.77395  , 1.33321  ,
            0.994238 , 0.731745 , 0.517412 , 0.352207 , 0.229715 , 0.136083 ,
            0.0559743, 0.       , 0.       , 0.       ])},
    'knots': {('O',
      'O'): array([1.0e-06, 1.0e-06, 1.0e-06, 1.0e-06, 2.0e-01, 4.0e-01, 6.0e-01,
            8.0e-01, 1.0e+00, 1.2e+00, 1.4e+00, 1.6e+00, 1.8e+00, 2.0e+00,
            2.2e+00, 2.4e+00, 2.6e+00, 2.8e+00, 3.0e+00, 3.2e+00, 3.4e+00,
            3.6e+00, 3.8e+00, 4.0e+00, 4.2e+00, 4.4e+00, 4.6e+00, 4.8e+00,
            5.0e+00, 5.0e+00, 5.0e+00, 5.0e+00]),
     ('Zr',
      'O'): array([1.0e-06, 1.0e-06, 1.0e-06, 1.0e-06, 2.0e-01, 4.0e-01, 6.0e-01,
            8.0e-01, 1.0e+00, 1.2e+00, 1.4e+00, 1.6e+00, 1.8e+00, 2.0e+00,
            2.2e+00, 2.4e+00, 2.6e+00, 2.8e+00, 3.0e+00, 3.2e+00, 3.4e+00,
            3.6e+00, 3.8e+00, 4.0e+00, 4.2e+00, 4.4e+00, 4.6e+00, 4.8e+00,
            5.0e+00, 5.0e+00, 5.0e+00, 5.0e+00]),
     ('Zr',
      'Zr'): array([1.0e-06, 1.0e-06, 1.0e-06, 1.0e-06, 2.0e-01, 4.0e-01, 6.0e-01,
            8.0e-01, 1.0e+00, 1.2e+00, 1.4e+00, 1.6e+00, 1.8e+00, 2.0e+00,
            2.2e+00, 2.4e+00, 2.6e+00, 2.8e+00, 3.0e+00, 3.2e+00, 3.4e+00,
            3.6e+00, 3.8e+00, 4.0e+00, 4.2e+00, 4.4e+00, 4.6e+00, 4.8e+00,
            5.0e+00, 5.0e+00, 5.0e+00, 5.0e+00])}}
    

    The most apparent difference is in the one-body offsets: After training: 'Zr': -20560.33609234794 After loading: 'Zr': -20560.3

    Impact on prediction accuracy

    This decreased precision noticeably affects the model's performance:

    Model with original precision:

    drawing

    Loaded model with 6 digit precision:

    drawing

    Solution

    Increasing the accuracy to 20 digits, using format(0, ".20g") instead of format(0, "g"), solves the issue for my model. However, I cannot assess whether this precision is large enough for other models or if other issues arise from this. Maybe someone has input on this so that this issue can be resolved.

    opened by henk789 1
  • Two-and-three body support for UFCalculator and UFLammps

    Two-and-three body support for UFCalculator and UFLammps

    • [WIP] Three-body contributions for UFCalculator for multicomponent systems are experiencing some minor bugs
    • Three-body contributions for UFLammps will require a tensor-product spline evaluator in C++ for LAMMPS
    duplicate invalid 
    opened by sxie22 1
  • UF3 PyPi Setup

    UF3 PyPi Setup

    This PR introduces the required changes to publish the package automatically to PyPi:

    1. Gather all the modules and submodules correctly in setup.py
    2. Link this repository as the project website
    3. Add __init__py to uf3.forcefield.properties
    4. Add MANIFEST.in to upload requirements.txt and readme.rst correctly
    5. Update requirements.txt to include all required and optional dependencies. This breaks pip install -r requirement.txt, but this step can be omitted as pip install . installs requirements automatically.
    6. Update tests to use new install mechanism (No more manual dependency installing)
    7. Add script to automatically publish to PyPi. This step can be extended to fetch the release number from the GitHub release if the pipeline works correctly.

    To complete the setup, a PyPi account secret needs to be configured in GitHub. This secret needs to have full account privileges for the first release, but can then be adapted to only allow access to the correct package.

    A demo of the pipeline has been tested in https://github.com/henk789/uf3 and is available at https://test.pypi.org/project/uf3/.

    opened by henk789 0
  • Gather changes for v0.3.0 release

    Gather changes for v0.3.0 release

    Prepare a new release to fix critical issues with model loading and multi-component systems:

    • #28 Models were not correctly loaded from json files
    • #30 Interactions across PBCs were assigned wrong element types, causing the model to learn on wrong interactions
    opened by henk789 0
  • Correct element sorting method

    Correct element sorting method

    Issue description

    The current element sorting method returns lists and sorts every element. This leads to runtime exceptions when loading models and incorrect three-body interactions. This issue is fixed by using the sort_interaction_symbols method that returns tuples and fixes central elements.

    opened by henk789 0
  • [WIP] Command line interface

    [WIP] Command line interface

    This PR addresses #4 and adds a functional CLI.

    Added Features

    The following functionalities are implemented:

    Generating initial config with specified atoms

    • [x] Create initial config with degree and atoms

    Collecting DFT data

    • [x] Collecting DFT data from single '.xyz' file/list of '.xyz' files
    • [x] Automatically searching working directory for '.xyz' files
    • [x] Converting '.xyz' files to data frame and storing as pickled file
    • [ ] Loading different DFT files
    • [ ] Split into train-test-validation
    • [ ] Adjusting column prefix

    Featurization

    • [x] Loading pickled files
    • [x] Loading '.xyz' files
    • [x] Automatic core count detection
    • [x] Specifying r_min/r_max/res_map as dict
    • [x] Specifying r_min/r_max/res_map as int/float and apply to all interactions
    • [x] Exporting features to file
    • [ ] Exporting features to data frame
    • [ ] Knot strategies
    • [ ] Loading and dumping knots
    • [ ] Only training on energies

    Fitting

    • [x] Same parameters as with Python featurization
    • [x] Exporting model to json file
    • [x] Predict with fitted model
    • [x] Test errors (RMSE and MAE)
    • [x] Train on subset of featurized data
    • [x] Predict on subset of featurized data

    Misc

    • [x] Automatic installation for easy use
    • [ ] Default settings file
    • [ ] Settings file from bspline_config

    YAML parameters not yet used:

    • seed
    • data
      • db_path
      • max_per_file
      • min_diff
      • generate_stats
      • vasp_pressure
      • sources
        • pattern
    • basis
      • fit_offsets
      • mask_trim
      • knot_strategy
      • knots_path
      • load_knots
      • dump_knots
    • features
      • db_path
      • fit_forces
      • column_prefix
    • learning
      • splits_path

    YAML parameters added:

    • verbose
    • data
      • pickle_path
      • train_pickle
      • test_pickle
    • features
      • batch_size
      • table_template
    • learning
      • batch_size

    Usage

    The CLI enables quick generation of models. The tungsten example can be executed in three lines:

    > uf3_cli config 3 W
    > uf3_cli collect options.yaml
    > uf3_cli featurize options.yaml
    > uf3_cli fit options.yaml
    

    with the required file names and training settings specified in options.yaml

    The code is robust towards errors and performs type conversion where possible.

    opened by henk789 0
  • UFCalculator error when model has resolution 0 for an interaction

    UFCalculator error when model has resolution 0 for an interaction

    Problem description

    When loading a model that has knot resolution 0 for an interaction, using UFCalculator results in an error message:

    Traceback (most recent call last):
      File "/home/***/***/***/.conda/envs/uf3_env/lib/python3.8/concurrent/futures/process.py", line 239, in _process_worker
        r = call_item.fn(*call_item.args, **call_item.kwargs)
      File "/scratch/slurm_tmpdir/job_21050829/ipykernel_1790295/233011300.py", line 22, in eval
        p_f = np.append(p_f, geom.get_forces())
      File "/home/***/***/***/.conda/envs/uf3_env/lib/python3.8/site-packages/ase/atoms.py", line 788, in get_forces
        forces = self._calc.get_forces(self)
      File "/pfs/data5/home/***/***/***/ba/uf3/uf3/forcefield/calculator.py", line 215, in get_forces
        f_3b = self.forces_3b(atoms, supercell)
      File "/pfs/data5/home/***/***/***/ba/uf3/uf3/forcefield/calculator.py", line 288, in forces_3b
        val_l = spline(triangles, nus=np.array([1, 0, 0]))
      File "/home/***/***/***/.conda/envs/uf3_env/lib/python3.8/site-packages/ndsplines/ndsplines.py", line 220, in __call__
        self.compute_basis_coefficient_selector(x, nus)
      File "/home/***/***/***/.conda/envs/uf3_env/lib/python3.8/site-packages/ndsplines/ndsplines.py", line 172, in compute_basis_coefficient_selector
        impl.evaluate_spline(t, k, x[:,i], nu, extrapolate_flag, self.interval_workspace[i], self.basis_workspace[i],)
      File "ndsplines/_bspl.pyx", line 96, in ndsplines._bspl.evaluate_spline
    ValueError: Buffer dtype mismatch, expected 'const double' but got 'long'
    

    Solution

    The issue arises due to the JSON parsing used when loading models. Since the seven knot positions are all 0, they are loaded as integers. However, the ndspline package requires double. Therefore, the issue can be avoided when converting integer knot positions to doubles.

    opened by henk789 0
  • Feature request: option for filtering configurations with large energies/forces

    Feature request: option for filtering configurations with large energies/forces

    Currently, parsed data from VASP, LAMMPS, etc is organized into a pandas dataframe by io.DataCoordinator with separate columns for energies (E), force-components (Fx, Fy, and Fz), and atoms per unit cell ("Size")

    We can have three additional user-parameters and a function to remove rows from the dataframe that exceed these constraints:

    1. Maximum energy (eV/atom)
    2. Maximum force (eV/angstrom)
    3. Maximum number of atoms per unit cell

    Note: force magnitudes should probably be considered per-atom rather than component-wise.

    enhancement 
    opened by sxie22 0
  • Command line interface and scripts

    Command line interface and scripts

    • Standalone scripts from the alpha version are currently incompatible with the latest refactor. They need to be rewritten, preferably with additional support for argparse.
    • Documentation for options and the input yaml are already complete.
    enhancement help wanted 
    opened by sxie22 0
  • Two-and-three body support for UFCalculator and UFLammps

    Two-and-three body support for UFCalculator and UFLammps

    • [WIP] Three-body contributions for UFCalculator for multicomponent systems are experiencing some minor bugs
    • Three-body contributions for UFLammps will require a tensor-product spline evaluator in C++ for LAMMPS
    enhancement 
    opened by sxie22 2
Releases(v0.3.2)
  • v0.3.2(Sep 29, 2022)

    This release includes necessary changes to publish uf3 to PyPi.

    Changes

    • Installing uf3 with pip now no longer requires the editable option -e.

    Full Changelog: https://github.com/uf3/uf3/compare/v0.3.0...v0.3.2

    Source code(tar.gz)
    Source code(zip)
  • v0.3.0(Sep 20, 2022)

    This release incorporates all changes from the development branch between July 24, 2022, and September 20, 2022.

    The update includes critical bug fixes for models with multi-component systems and is not compatible with previously generated feature data and fitted models.

    Bug Fixes

    • Fix multi-component pair and triplet building (PR by @henk789 in https://github.com/uf3/uf3/pull/31)
      • Two- and three-body interactions across periodic boundary conditions were occasionally assigned incorrect element species. All multi-component models, therefore, require new featurization and new fitting.
    • Fix issue with loading wrong model coefficients (PR by @henk789 in https://github.com/uf3/uf3/pull/32)
      • Loading models from JSON files resulted in wrong coefficients. Stored models are unaffected but are now loading correctly. The bug affected the master branch since v0.2.0.
    • Sort pair tuples correctly during loading (PR by @henk789 in https://github.com/uf3/uf3/pull/25)
    • Sort pair hashes by electronegativity (PR by @henk789 in https://github.com/uf3/uf3/pull/27)

    Full Changelog: https://github.com/uf3/uf3/compare/v0.2.0...v0.3.0

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jul 24, 2022)

    This release incorporates all changes from the development branch between Dec 9, 2021 and July 23, 2022. The update includes changes to function names and arguments, so please check the updated examples and changelog.

    Additions:

    • Per-sample weighting during fitting
    • Enforce repulsion at small distances for pair potentials where basis functions are entirely outside of training data domain
    • Improved saving/loading classes to/from JSON files (PR #18, PR #20, PR #21 from @henk789)
    • Three-body visualization with slices
    • Three-body visualization with Plotly-based rendering
    • Support for forcing leading (small-distance) basis functions to zero in addition to previously-implemented trailing_trim.
    • Support for BSplines with negative-valued knots. Note: LAMMPS' pair_style table requires positive-valued knots.
    • Additional keywords for finer control of plotting functions.

    Changes:

    • Remove unused keywords, such as chemical_system for BasisFeaturizer (PR #9 from @Robert-Schmid)
    • Serialize uncompressed coefficient array for three-body terms
    • New default values for regularizers

    Fixes:

    • Increased decimal precision when writing to file
    • Fit with a list of keys rather than requiring both integer slices and keys
    • Handle divide-by-zero errors when training with a single atomic configuration
    • Speed up python-based ASE calculator for single- and multi-component systems using NDSplines package
    • New default color and line-style settings for plotting pair potentials
    Source code(tar.gz)
    Source code(zip)
Owner
Ultra-Fast Force Fields
Fast, interpretable machine-learning potentials.
Ultra-Fast Force Fields
Hypothesis strategies for generating Python programs, something like CSmith

hypothesmith Hypothesis strategies for generating Python programs, something like CSmith. This is definitely pre-alpha, but if you want to play with i

Zac Hatfield-Dodds 73 Dec 14, 2022
A simple Python script for generating a variety of hashes from safe urandom entropy.

Hashgen A simple Python script for generating a variety of hashes from safe urandom entropy. For whenever you need a random hash (e.g. generating an a

Xanspie 1 Feb 17, 2022
This program is meant to take the pain out of generating nice bash PS1 prompts.

TOC PS1 Installation / Quickstart License Other Docs Examples PS1 Command Help PS1 ↑ This program is meant to take the pain out of generating nice bas

Steven Hollingsworth 6 Jun 19, 2022
Generating rent availability info from Effort rent

Rent-info Generating rent availability info from Effort rent Pre-Installation Latest version of python Pip module json, os, requests, datetime, time i

Laixuan 1 Oct 20, 2021
A NetBox Plugin that gives a UI for generating, comparing and deploying configurations to devices.

netbox_config_plugin - A plugin to generate, compare and deploy configurations This plugin allows you to execute your code to generate a config for a

Jo 11 Dec 21, 2022
A feed generator. Currently supports generating RSS feeds from Google, Bing, and Yahoo news.

A feed generator. Currently supports generating RSS feeds from Google, Bing, and Yahoo news.

Josh Cardenzana 0 Dec 13, 2021
A simple script for generating screenshots with Vapoursynth

Vapoursynth-Screenshots A simple script for generating screenshots with Vapoursynth. About I'm lazy, and hate changing variables for each batch of scr

null 7 Dec 31, 2022
Meera 2 May 12, 2022
A multi purpose password managing and generating tool called Kyper.

Kyper A multi purpose password managing and generating tool called Kyper. Setup The setup for Kyper is fairly simple only involving the command python

Jan Dorian Poczekaj 1 Feb 5, 2022
A tool for generating skill map/tree like diagram

skillmap A tool for generating skill map/tree like diagram. What is a skill map/tree? Skill tree is a term used in video games, and it can be used for

Yue 98 Jan 7, 2023
Python Library to get fast extensive Dummy Data for testing

Dumda Python Library to get fast extensive Dummy Data for testing https://pypi.org/project/dumda/ Installation pip install dumda Usage: Cities from d

Oliver B. 0 Dec 27, 2021
JLC2KICAD_lib is a python script that generate a component library for KiCad from the JLCPCB/easyEDA library.

JLC2KiCad_lib is a python script that generate a component library (schematic, footprint and 3D model) for KiCad from the JLCPCB/easyEDA library. This script requires Python 3.6 or higher.

Nicolas Toussaint 73 Dec 26, 2022
K2HASH Python library - NoSQL Key Value Store(KVS) library

k2hash_python Overview k2hash_python is an official python driver for k2hash. Install Firstly you must install the k2hash shared library: curl -o- htt

Yahoo! JAPAN 3 Oct 19, 2022
A fast Python in-process signal/event dispatching system.

Blinker Blinker provides a fast dispatching system that allows any number of interested parties to subscribe to events, or "signals". Signal receivers

jason kirtland 1.4k Dec 31, 2022
A fast python implementation of DTU MVS 2014 evaluation

DTUeval-python A python implementation of DTU MVS 2014 evaluation. It only takes 1min for each mesh evaluation. And the gap between the two implementa

null 82 Dec 27, 2022
Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source.

Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source. Getting Started This is an example of ho

null 14 Apr 10, 2022
Fast Base64 encoding/decoding in Python

Fast Base64 implementation This project is a wrapper on libbase64. It aims to provide a fast base64 implementation for base64 encoding/decoding. Insta

Matthieu Darbois 96 Dec 26, 2022
Python binding to rust zw-fast-quantile

zw_fast_quantile_py zw-fast-quantile python binding Installation pip install zw_fast_quantile_py Usage import zw_fast_quantile_py

Paul Meng 1 Dec 30, 2021
A Pythonic Data Catalog powered by Ray that brings exabyte-level scalability and fast, ACID-compliant, change-data-capture to your big data workloads.

DeltaCAT DeltaCAT is a Pythonic Data Catalog powered by Ray. Its data storage model allows you to define and manage fast, scalable, ACID-compliant dat

null 45 Oct 15, 2022