Git Product home page Git Product logo

pymatgen-analysis-defects's Introduction

pymatgen-analysis-defects

testing codecov zenodo pypi

๐Ÿ“„ Full Documentation Paper

This package is an extension to pymatgen for performing defect analysis. The package is designed to work with VASP inputs and output files and is meant to be used as a namespace package extension to the main pymatgen library. The new module has been redesigned to work closely with atomate2.

While the atomate2 automation framework is not required for this code to be useful, users are strongly encouraged to to adopt the atomate2 framework as it contains codified "best practices" for running defect calculations as well as orchestrating the running of calculations and storing the results.

The package serves as an object-oriented interface to defect physics and is capable of generating a list of non-equivalent defect objects directly from the Materials Project API.

from pymatgen.analysis.defects.generators import ChargeInterstitialGenerator, generate_all_native_defects
from pymatgen.ext.matproj import MPRester
with MPRester() as mpr:
chgcar = mpr.get_charge_density_from_material_id("mp-804")
for defect in generate_all_native_defects(chgcar):
    print(defect)

Non-exhaustive list of features:

Reproducible definition of defects

Defects are defined based on the physical concept they represent, independent of the calculation details such as simulation cell size. As an example, a Vacancy defect is defined by the primitive cell of the pristine material plus a single site that represents the vacancy site in the unit cell.

Formation energy calculations

The formation energy diagram is a powerful tool for understanding the thermodynamics of defects. This package provides a simple interface for calculating the formation energy diagram from first-principles results. This package handles the energy accounting of the chemical species for the chemical potential calculations, which determines the y-offset of the formation energy. This package also performs finite-size corrections for the formation energy which is required when studying charged defects in periodic simulation cells.

Defect Position

Identification of the defect positions in a simulation cell after atomic relaxation is not trivial since the many atoms can collectively shift in response to the creation of the defect. Yet the exact location of the defect is required for the calculation of finite-size corrections as well as other physical properties. We devised a method based on calculating a SOAP-based distortion field that can be used to identify the defect position in a simulation cell. Note, this method only requires the reference pristine supercell and does not need prior knowledge of how the defect was created.

Defect Complexes

Multiple defects can be composed into defect complexes. The complex is can be treated as a normal defect object for subsequent analysis.

Defect Interactions

Simulation of defect-photon and defect-phonon interactions under the independent particle approximation.

Previous versions of the defects code

This package replaces the older pymatgen.analysis.defects modules. The previous module was used by pyCDT code which will continue to work with version 2022.7.8 of pymatgen.

Contributing

The source code can be downloaded from the GitHub repository at

$ git clone https://github.com/materialsproject/pymatgen-analysis-defects.git

All code contributions are welcome. Please submit a pull request on GitHub. To make maintenance easier, please use a workflow similar to the automated CI workflow.

Specifically, please make sure to run the following commands for linting:

$ pip install -e .[strict]
$ pip install -e .[dev]
$ pre-commit install
$ pre-commit run --all-files

And run these commands for testing:

$ pip install -e .[strict]
$ pip install -e .[tests]
$ pytest --cov=pymatgen
$ pytest --nbmake ./docs/source/content

For more details about what is actually installed with each of the pip install .[arg] commands, please inspect the pyproject.toml file.

Contributors

  • Lead developer: Dr. Jimmy-Xuan Shen
  • This code contains contributions from the original defects analysis module of pymatgen from Dr. Danny Broberg and Dr. Shyam Dwaraknath.

pymatgen-analysis-defects's People

Contributors

dependabot[bot] avatar github-actions[bot] avatar janosh avatar jmmshn avatar kavanase avatar kyleniemeyer avatar njzjz avatar nwinner avatar pre-commit-ci[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pymatgen-analysis-defects's Issues

chempot_limits does not recognize multi-element compounds

@jmmshn

Hi,

fed = FormationEnergyDiagram.with_directories(
    directory_map={
        "bulk": sc_dir / "bulk_sc",
        0: sc_dir / "q=0",
        -1: sc_dir / "q=-1",
        1: sc_dir / "q=1",
    },
    defect=mg_ga,
    pd_entries=ents,
    dielectric=10,
)
fed.chempot_limits

If bulk_sc is specified as a multi-element compound (2 is normal, 5 is abnormal), an error will be reported as follows,

C20 H12 N2 O4 Pb
1.0
       16.4335994720         0.0000000000         0.0000000000
        0.0000000000         7.2800998688         0.0000000000
       -4.5973771273         0.0000000000        13.4018847289
   Pb    O    N    C    H
    4   16    8   80   48
Direct
...
  fed = FormationEnergyDiagram.with_directories(
  File "C:\Users\lenovo\anaconda3\lib\site-packages\pymatgen\analysis\defects\thermo.py", line 363, in with_directories
    return cls(
  File "<string>", line 9, in __init__
  File "C:\Users\lenovo\anaconda3\lib\site-packages\pymatgen\analysis\defects\thermo.py", line 230, in __post_init__
    chempot_limits = self.chempot_diagram.domains[
KeyError: 'H12PbC20(NO2)2'

Try modifying ~\anaconda3\Lib\site-packages\pymatgen\analysis\defects\thermo.py, L230-232,

        chempot_limits = self.chempot_diagram.domains[
            # self.bulk_entry.composition.reduced_formula
	    self.bulk_entry.composition.composition.anonymized_formula
        ]

or

        chempot_limits = self.chempot_diagram.domains[
            # self.bulk_entry.composition.reduced_formula
            'H12PbC20N2O4'
        ]

or

        chempot_limits = self.chempot_diagram.domains[
            # self.bulk_entry.composition.reduced_formula
            'HPbCNO'
        ]

The above attempts were unsuccessful.

Order of Antisites generated

I am wondering it might be better to replace species = set(map(_element_str, struct.species)) by species = list(dict.fromkeys(map(_element_str, struct.species))). This can avoid the unordered nature of set and help uniquely bookkeeping the defects together with defect_index. This could help database query.

[Bug]: Incorrect formation energies in FormationEnergyDiagram

Problem

Formation energy term in the line below is wrong, please see the link for the file and location

(self.dft_energies[Element(el)] + chempots[Element(el)]) * fac

https://github.com/materialsproject/pymatgen-analysis-defects/blob/564210e6fbd98793928da722e6154bc010aad1c1/pymatgen/analysis/defects/thermo.py#L459C17-L459C73

Proposed Solution

the value of " chempots[Element(el)]" variable above already includes DFT energy meaning the chempot is $\mu^0 + \Delta\mu$ as defined in pymatgen. Adding "self.dft_energies[Element(el)] " makes the line above equal to $2\mu^0 + \Delta\mu$

Alternatives

No response

Interstitial Generator Have to Take CHGCAR?

Hi!

I cannot find the previous method in InterstitialGenerator, which takes just a pmg structure and target element to insert and finds possible interstitial sites. Now, it seems that the CHGCAR is compulsory. May I ask why the previous method is removed?

For reference, the above mentioned legacy InterstitialGenerator is in the last release of pymatgen that still contains the InterstitialGenerator, which is v2022.7.19. And the generator was defined this way: https://github.com/materialsproject/pymatgen/blob/0adae3b3eab8217be6d1abbb314d1b733dfebad6/pymatgen/analysis/defects/generators.py#L149-L187

LICENSE oopsies

Problem

Your LICENSE file says atomate2 ๐Ÿ˜‰

Proposed Solution

Change the name of this package from pymatgen-analysis-defects to atomate2, obviously.

Alternatives

No response

VoronoiInterstitialGenerator

Hello! Thank you for your new Package!
I am trying to change to the newest pymatgen version and found out that the old line does not work anymore:
from pymatgen.analysis.defects.generators import VoronoiInterstitialGenerator
Unfortunately, I was not be able to find the good replacement in the existing package. Do you plan to add it in the future versions as it was earlier, for example in v2021.x.X?

configuration error: `project.requires-python` must be pep508-versionspec

I tried to build pymatgen-analysis-defects in conda-forge/staged-recipes#21478, and I got the following error:

2022-12-09T04:47:37.6680409Z   configuration error: `project.requires-python` must be pep508-versionspec
2022-12-09T04:47:37.6687732Z   DESCRIPTION:
2022-12-09T04:47:37.6694317Z       `The Python version requirements of the project
2022-12-09T04:47:37.6701191Z       <https://packaging.python.org/specifications/core-metadata/#requires-
2022-12-09T04:47:37.6707691Z       python>`_.
2022-12-09T04:47:37.6714013Z 
2022-12-09T04:47:37.6720766Z   GIVEN VALUE:
2022-12-09T04:47:37.6727245Z       ">=\"3.8\""
2022-12-09T04:47:37.6733455Z 
2022-12-09T04:47:37.6740068Z   OFFENDING RULE: 'format'
2022-12-09T04:47:37.6746284Z 
2022-12-09T04:47:37.6752766Z   DEFINITION:
2022-12-09T04:47:37.6759484Z       {
2022-12-09T04:47:37.6765973Z           "type": "string",
2022-12-09T04:47:37.6772722Z           "format": "pep508-versionspec"
2022-12-09T04:47:37.6779208Z       }
2022-12-09T04:47:37.6785905Z   Traceback (most recent call last):
2022-12-09T04:47:37.6924462Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 351, in <module>
2022-12-09T04:47:37.6925898Z       main()
2022-12-09T04:47:37.6927199Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 333, in main
2022-12-09T04:47:37.6928332Z       json_out['return_val'] = hook(**hook_input['kwargs'])
2022-12-09T04:47:37.6928741Z                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2022-12-09T04:47:37.6930060Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/pip/_vendor/pep517/in_process/_in_process.py", line 152, in prepare_metadata_for_build_wheel
2022-12-09T04:47:37.6931163Z       return hook(metadata_directory, config_settings)
2022-12-09T04:47:37.6931551Z              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2022-12-09T04:47:37.6932841Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/build_meta.py", line 377, in prepare_metadata_for_build_wheel
2022-12-09T04:47:37.6933833Z       self.run_setup()
2022-12-09T04:47:37.6935041Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/build_meta.py", line 335, in run_setup
2022-12-09T04:47:37.6936120Z       exec(code, locals())
2022-12-09T04:47:37.6936493Z     File "<string>", line 1, in <module>
2022-12-09T04:47:37.6937738Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/__init__.py", line 87, in setup
2022-12-09T04:47:37.6938715Z       return distutils.core.setup(**attrs)
2022-12-09T04:47:37.6939061Z              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2022-12-09T04:47:37.6940279Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/_distutils/core.py", line 159, in setup
2022-12-09T04:47:37.6941259Z       dist.parse_config_files()
2022-12-09T04:47:37.6942489Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/dist.py", line 868, in parse_config_files
2022-12-09T04:47:37.6943558Z       pyprojecttoml.apply_configuration(self, filename, ignore_option_errors)
2022-12-09T04:47:37.6944925Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 62, in apply_configuration
2022-12-09T04:47:37.6946090Z       config = read_configuration(filepath, True, ignore_option_errors, dist)
2022-12-09T04:47:37.6946573Z                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2022-12-09T04:47:37.6947868Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 126, in read_configuration
2022-12-09T04:47:37.6948864Z       validate(subset, filepath)
2022-12-09T04:47:37.6950114Z     File "/home/conda/staged-recipes/build_artifacts/pymatgen-analysis-defects_1670561212733/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_place/lib/python3.11/site-packages/setuptools/config/pyprojecttoml.py", line 51, in validate
2022-12-09T04:47:37.6951138Z       raise ValueError(f"{error}\n{summary}") from None
2022-12-09T04:47:37.6951688Z   ValueError: invalid pyproject.toml config: `project.requires-python`.
2022-12-09T04:47:37.6952305Z   configuration error: `project.requires-python` must be pep508-versionspec
2022-12-09T04:47:37.7138427Z   error: subprocess-exited-with-error

gulp_caller still used?

Says here the pymatgen gulp_caller module is "used extensively" by pymatgen-analysis-defects. I assume that's outdated? Can't find any mention of gulp here. Thinking of removing the gulp module from pymatgen.

Can we remove the numpy pin

Currently, the numpy version is set to numpy<=1.23.5. @jmmshn, this is causing some dependency issues for me. Any chance we can remove the pin?

Defect charge states

Hello! Great package!

@kavanase and I are working on refactoring our defect structure package to use the new Defect class for compatibility with pymatgen-analysis-defects.
For this, it would be helpful if the Defect class had a charges attribute where the user can customise the charge states of the defect (e.g. by default, it could be 0 or the result of .get_charge_states() but can also be customised by the user).
Alternatively, the Interstitial/Vacancy/Substitution classes could inherit from Defect or DefectSpecies (modified Defect class with charges attribute) depending on if the charges were defined.

What do you think is the best approach?

Thanks!

Missing VoronoiInterstitialGenerator when installing from conda-forge

Hi, all!
I'm trying to use the VoronoiInterstitialGenerator but find that this function is missing if I install the Pymatgen-analysis-defects from conda-forge channel. Is it because that the newest version is not updated yet? Or shall I install from pip?

Thanks in advance!

[Feature Request]: Customizing pd_entries in FormationEnergyDiagram

Problem

I'd like to customize pd_entries in the FormationEnergyDiagram setup as shown below:

ents = MPR.get_entries_in_chemsys(['Mg', 'Ga', 'N']) or ents = loadfn("Ga_Mg_N.json")
sc_dir = "Mg_Ga/"
fed = FormationEnergyDiagram.with_directories(
    directory_map={
        "bulk": sc_dir + "bulk_sc",
        0: sc_dir + "q=0",
        -1: sc_dir + "q=-1",
        1: sc_dir + "q=1",
    },
    defect=ens,
    pd_entries=ents,
    dielectric=10,
)

I have locally calculated the decomposition phases and competing phases (e.g., mp-1095013 MgGa, mp-844 POSCAR_Ca3N2, mp-1184449 POSCAR_CaMg149, mp-25 POSCAR_N2). I'm wondering if I should modify the pd_entries similar to this:

pd_entries = [
    {"Data": {"run_type": "GGA", "mp-1095013-GGA ComputedStructureEntry": "Mg2 Ga2 (MgGa)", "Energy (Final)": "-8.1302 eV (-2.0325 eV/atom)"}},
    {"Data": {"run_type": "GGA", "mp-1094626-GGA ComputedStructureEntry": "Mg5 Ga1 (Mg5Ga)", "Energy (Final)": "-11.1926 eV (-1.8654 eV/atom)"}}
]

or

pd_entries = [
    {"Mg2 Ga2 (MgGa)", "-8.1302 eV"},
    {"Mg5 Ga1 (Mg5Ga)", "-11.1926 eV"}
]

Thank you!

Proposed Solution

What would be the simplest way to write pd_entries for locally calculated competing phases? Thank you once again!

Alternatives

No response

Kumagai/eFNV Correction?

Hi @jmmshn!
I noticed there is no Kumagai / eFNV correction function in corrections.py, as there was in the previous pymatgen module (I actually went looking for this because I had a fix for a small bug to push). I was just wondering if this will be added to this package?
It was useful for calculating the defect charge corrections in anisotropic systems!
Cheers!

FormationEnergyDiagram() in thermo module breaks for single-element systems

I have been working on a calculation of vacancy formation energy for cubic Si, and am having problems with calling FormationEnergyDiagram() from thermo.py because my system has only one element. The issue is concerning the pd_entries argument to FormationEnergyDiagram()
To get the pd_entries, I run:
pd_entries = mpr.get_entries_in_chemsys("Si")
After passing this into FormationEnergyDiagram() , I get the following error:

ValueError                                Traceback (most recent call last)
Cell In[18], line 1
----> 1 fed = FormationEnergyDiagram(defect_entries, pd_entries, vbm, bulk_entry = bulk_entry)

File <string>:9, in __init__(self, defect_entries, pd_entries, vbm, band_gap, bulk_entry, inc_inf_values)

File ~/miniconda3/envs/atomate2-defects/lib/python3.10/site-packages/pymatgen/analysis/defects/thermo.py:245, in FormationEnergyDiagram.__post_init__(self)
    242     entries.append(ComputedEntry.from_dict(d_))
    243     entries.append(ComputedEntry.from_dict(d_))
--> 245 self.chempot_diagram = ChemicalPotentialDiagram(entries)
    246 chempot_limits = self.chempot_diagram.domains[
    247     bulk_entry.composition.reduced_formula
    248 ]
    250 if self.inc_inf_values:

File ~/miniconda3/envs/atomate2-defects/lib/python3.10/site-packages/pymatgen/analysis/chempot_diagram.py:102, in ChemicalPotentialDiagram.__init__(self, entries, limits, default_min_limit)
     96 (
     97     self._hyperplanes,
     98     self._hyperplane_entries,
     99 ) = self._get_hyperplanes_and_entries()
    101 if self.dim < 2:
--> 102     raise ValueError("ChemicalPotentialDiagram currently requires phase diagrams with 2 or more elements!")
    104 if len(self.el_refs) != self.dim:
    105     missing = set(self.elements) - set(self.el_refs)
ValueError: ChemicalPotentialDiagram currently requires phase diagrams with 2 or more elements!

The call is failing because FormationEnergyDiagram() calls ChemicalPotentialDiagram(), which requires 2 or more elements to make a phase diagram, and I only have one element. I'm not sure how to address the issue, do you have any suggestions?

[Feature Request]:

Problem

I wanted to create an interstitial defect using this script, but it does not work. It shows class is not iterable.

from pymatgen.analysis.defects.generators import DefectGenerator, InterstitialGenerator
initial_struct = Structure.from_file('POSCAR')
inter_element = Element('C')
defects = [defect for defect in InterstitialGenerator(initial_struct, inter_element)]

Proposed Solution

Explain, what are the inputs to the function and class.

Alternatives

No response

Dependency version conflicts

I'm getting dependency version conflicts when trying to update to pymatgen-analysis-defects 2023.5.4 with atomate2.

The conflict is caused by:
    atomate2[strict] 0.0.10.post256+ga84e4d33.d20230508 depends on pymatgen>=2023.1.9
    atomate2[strict] 0.0.10.post256+ga84e4d33.d20230508 depends on pymatgen==2023.3.23; extra == "strict"
    emmet-core 0.54.2 depends on pymatgen>=2021.3
    lobsterpy 0.2.9 depends on pymatgen>=2023.1.20
    mp-api 0.33.1 depends on pymatgen>=2022.3.7
    pymatgen-analysis-defects 2023.5.4 depends on pymatgen==2023.1.9

It seems like pymatgen-analysis-defects 2023.5.4 is pinned to pymatgen==2023.1.9 rather than a more flexible ">=".

Is there any chance you can push a new version with more relaxed dependencies.

Class attribute to store defect supercell structure

Hi @jmmshn!

For easier compatibility with the ShakeNBreak code, it would be useful if the defect supercell structure (generated with get_supercell_structure) was stored as a class attribute. In this way, the user could generate supercells for all their defects and then just feed them into ShakeNBreak/other codes. Would this be possible?

Thanks! :)

Numba dependency

recombination.py imports from numba. Should be added as a dependency or made optional.

Vacancy naming convention

Hi!
@utf and I were discussing the naming convention for defects (and defect calculation folders), and were thinking that Va in Va_X for vacancies looks like an element symbol.
Using something different, like v_X may be slightly more intuitive and easier to pick distinguish when e.g. looking at a list of defects / defect folders (where X_i, X_Y and v_X are easier to pick out, as interstitials, substitutions and vacancies).

An added point would be that v_X would correspond to the conventional Kroger-Vink notation, as the names for interstitials and substitutions already do here:
https://en.wikipedia.org/wiki/Kr%C3%B6ger%E2%80%93Vink_notation

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.