# Path: veidt/abstract.py
# class Model(BaseEstimator, MSONable):
#     """
#     Abstract Base class for a Model. Basically, it usually wraps around a deep
#     learning package, e.g., the Sequential Model in Keras, but provides for
#     transparent conversion of arbitrary input and outputs.
#     """
# 
#     @abc.abstractmethod
#     def fit(self, features, targets, **kwargs):
#         """
# 
#         :param features: Numerical input feature list or numpy array with dim (m, n)
#             where m is the number of data and n is the feature dimension
#         :param targets: Numerical output target list, or numpy array with dim (m, )
#         """
#         pass
# 
#     @abc.abstractmethod
#     def predict(self, features):
#         """
#         Predict the values given a set of inputs based on fitted model.
# 
#         :param features: List of input features
# 
#         :return: List of output objects
#         """
#         pass
# 
#     def evaluate(self, features, targets, metrics=['mae'], multi_targets=False):
#         """
#         evaluate the performance of model based on metric.
#         :return: dict of metric evaluations
#         """
#         pred_targets = self.predict(features)
#         evaluation = {}
#         if not multi_targets:
#             targets = [targets]
#             pred_targets = [pred_targets]
#         for metric in metrics:
#             veidt_metric = get(metric)
#             evaluation[metric] = [veidt_metric(np.array(target).ravel(), np.array(pred_target).ravel()) for
#                                   target, pred_target in zip(targets, pred_targets)]
#         return evaluation


import abc
import abc
from veidt.abstract import Model
from monty.json import MSONable
        stresses corresponding to structures.
        :param train_structures: List of Pymatgen Structure objects.
        :param energies: List of DFT-calculated total energies of each structure
            in structures list.
        :param forces: List of DFT-calculated (m, 3) forces of each structure
            with m atoms in structures list. m can be varied with each single
            structure case.
        :param stresses: List of DFT-calculated (6, ) virial stresses of each
            structure in structures list.
        """
        pass

    @abc.abstractmethod
    def evaluate(self, test_structures, ref_energies, ref_forces, ref_stresses):
        """
        Evaluate energies, forces and stresses of structures with trained
        interatomic potential.
        :param test_structures: List of Pymatgen Structure Objects.
        :param ref_energies: List of DFT-calculated total energies of each
            structure in structures list.
        :param ref_forces: List of DFT-calculated (m, 3) forces of each
            structure with m atoms in structures list. m can be varied with
            each single structure case.
        :param ref_stresses: List of DFT-calculated (6, ) viriral stresses of
            each structure in structures list.
        :return: DataFrame of original data and DataFrame of predicted data.
        """
        pass



# Path: veidt/abstract.py
# class Model(BaseEstimator, MSONable):
#     """
#     Abstract Base class for a Model. Basically, it usually wraps around a deep
#     learning package, e.g., the Sequential Model in Keras, but provides for
#     transparent conversion of arbitrary input and outputs.
#     """
# 
#     @abc.abstractmethod
#     def fit(self, features, targets, **kwargs):
#         """
# 
#         :param features: Numerical input feature list or numpy array with dim (m, n)
#             where m is the number of data and n is the feature dimension
#         :param targets: Numerical output target list, or numpy array with dim (m, )
#         """
#         pass
# 
#     @abc.abstractmethod
#     def predict(self, features):
#         """
#         Predict the values given a set of inputs based on fitted model.
# 
#         :param features: List of input features
# 
#         :return: List of output objects
#         """
#         pass
# 
#     def evaluate(self, features, targets, metrics=['mae'], multi_targets=False):
#         """
#         evaluate the performance of model based on metric.
#         :return: dict of metric evaluations
#         """
#         pred_targets = self.predict(features)
#         evaluation = {}
#         if not multi_targets:
#             targets = [targets]
#             pred_targets = [pred_targets]
#         for metric in metrics:
#             veidt_metric = get(metric)
#             evaluation[metric] = [veidt_metric(np.array(target).ravel(), np.array(pred_target).ravel()) for
#                                   target, pred_target in zip(targets, pred_targets)]
#         return evaluation


# Path: veidt/potential/abstract.py
import abc
import abc
from veidt.abstract import Model
from monty.json import MSONable

        stresses corresponding to structures.
        :param train_structures: List of Pymatgen Structure objects.
        :param energies: List of DFT-calculated total energies of each structure
            in structures list.
        :param forces: List of DFT-calculated (m, 3) forces of each structure
            with m atoms in structures list. m can be varied with each single
            structure case.
        :param stresses: List of DFT-calculated (6, ) virial stresses of each
            structure in structures list.
        """
        pass

    @abc.abstractmethod
    def evaluate(self, test_structures, ref_energies, ref_forces, ref_stresses):
        """
        Evaluate energies, forces and stresses of structures with trained
        interatomic potential.
        :param test_structures: List of Pymatgen Structure Objects.
        :param ref_energies: List of DFT-calculated total energies of each
            structure in structures list.
        :param ref_forces: List of DFT-calculated (m, 3) forces of each
            structure with m atoms in structures list. m can be varied with
            each single structure case.
        :param ref_stresses: List of DFT-calculated (6, ) viriral stresses of
            each structure in structures list.
        :return: DataFrame of original data and DataFrame of predicted data.
        """
        pass



class PotentialVeidt(Model):