# Path: molml/features.py

# 
# Path: molml/constants.py
# BOND_LENGTHS = {
#     "C": {
#         "3":   0.62,
#         "2":   0.69,
#         "Ar": 0.72,
#         "1":   0.85,
#     },
#     "Cl": {
#         "1":   1.045,
#     },
#     "F": {
#         "1":   1.23,
#     },
#     "H": {
#         "1":   0.6,
#     },
#     "N": {
#         "3":   0.565,
#         "2":   0.63,
#         "Ar": 0.655,
#         "1":   0.74,
#     },
#     "O": {
#         "3":   0.53,
#         "2":   0.59,
#         "Ar": 0.62,
#         "1":   0.695,
#     },
#     "P": {
#         "2":   0.945,
#         "Ar": 0.985,
#         "1":   1.11,
#     },
#     "S": {
#         "2":   0.905,
#         "Ar": 0.945,
#         "1":   1.07,
#     },
# }
# 
# ELE_TO_NUM = bidict({
#     'H': 1,
#     'C': 6,
#     'N': 7,
#     'O': 8,
#     'F': 9,
#     'P': 15,
#     'S': 16,
#     'Cl': 17,
#     'Br': 35,
#     'I': 53,
#     'Se': 34
# })


import numpy as np
from molml.features import Connectivity, Autocorrelation
from molml.constants import BOND_LENGTHS, ELE_TO_NUM


# Currently, there are two recommended ways to work with elements that are not
# included in molml/constants.py. In this example, we will look at an iron
# complex (iron is not in the constants).
# Maybe at some point, molml will include more constants, but it seems outside
# of the scope of this library.

if __name__ == '__main__':
    elements = ['Fe', 'H', 'H', 'H', 'H', 'H', 'H']
    coords = np.array([
        [0., 0., 0.],
        [1.46, 0., 0.],
        [0., 1.46, 0.],
        [0., 0., 1.46],
        [-1.46, 0., 0.],
        [0., -1.46, 0.],
        [0., 0., -1.46],
    ])
    feat = Connectivity(depth=2)
    # Notice the warning about missing elements.

# Path: molml/features.py

# 
# Path: molml/constants.py
# BOND_LENGTHS = {
#     "C": {
#         "3":   0.62,
#         "2":   0.69,
#         "Ar": 0.72,
#         "1":   0.85,
#     },
#     "Cl": {
#         "1":   1.045,
#     },
#     "F": {
#         "1":   1.23,
#     },
#     "H": {
#         "1":   0.6,
#     },
#     "N": {
#         "3":   0.565,
#         "2":   0.63,
#         "Ar": 0.655,
#         "1":   0.74,
#     },
#     "O": {
#         "3":   0.53,
#         "2":   0.59,
#         "Ar": 0.62,
#         "1":   0.695,
#     },
#     "P": {
#         "2":   0.945,
#         "Ar": 0.985,
#         "1":   1.11,
#     },
#     "S": {
#         "2":   0.905,
#         "Ar": 0.945,
#         "1":   1.07,
#     },
# }
# 
# ELE_TO_NUM = bidict({
#     'H': 1,
#     'C': 6,
#     'N': 7,
#     'O': 8,
#     'F': 9,
#     'P': 15,
#     'S': 16,
#     'Cl': 17,
#     'Br': 35,
#     'I': 53,
#     'Se': 34
# })


# Path: examples/missing_constants.py
import numpy as np
from molml.features import Connectivity, Autocorrelation
from molml.constants import BOND_LENGTHS, ELE_TO_NUM



# Currently, there are two recommended ways to work with elements that are not
# included in molml/constants.py. In this example, we will look at an iron
# complex (iron is not in the constants).
# Maybe at some point, molml will include more constants, but it seems outside
# of the scope of this library.

if __name__ == '__main__':
    elements = ['Fe', 'H', 'H', 'H', 'H', 'H', 'H']
    coords = np.array([
        [0., 0., 0.],
        [1.46, 0., 0.],
        [0., 1.46, 0.],
        [0., 0., 1.46],
        [-1.46, 0., 0.],
        [0., -1.46, 0.],
        [0., 0., -1.46],
    ])
    feat = Connectivity(depth=2)
    # Notice the warning about missing elements.

    print(feat.fit_transform([(elements, coords)]))