# Path: attitude/orientation/pca.py
# def random_pca(scattered=True):
# def augment(matrix):
# def augment_vector(vec):
# def rotate_tensor(tensor,transform):
# def compose_affine(*transforms):
# def normalize(v):
# def axis_transform(pca_axes):
# def test_SVD(pca):
# def covariance_matrix(self):
#     def from_axes(axes):
#     def __init__(self, arr, weights=None,  axes=None):
#     def __run_svd(self):
#     def __load_saved_fit(self, axes):
#     def __compute_derived_parameters(self):
#     def U(self):
#     def eigenvalues(self):
#     def rotated(self):
#     def residuals(self):
#     def center(self):
#     def centered_array(self):
#     def hyperbolic_axes(self):
#     def angular_error(self, axis_length):
#     def angular_errors(self, degrees=True):
#     def _covariance_matrix(self, type='noise'):
#     def covariance_matrix(self):
#     def explained_variance(self):
#     def coefficients(self):
#     def azimuth(self):
#     def slope(self):
#     def _strike_dip(self):
#     def strike_dip(self, degrees=True):
#     def _rake(self):
#     def rake(self):
#     def strike_dip_rake(self):
#     def as_conic(self, level=1):
#     def as_hyperbola(self, rotated=False):
#     def _ellipse(self, level=1):
#     def plane_errors(self, **kwargs):
#     def error_coords(self, **kwargs):
#     def slope(self):
#     def error_ellipse(self, spherical=True, vector=False, level=1):
#     def to_mapping(self,**values):
#     def __repr__(self):
# class PCAOrientation(BaseOrientation):
#         R = augment(self.axes)
#             R = augment(self.axes)


from .pca import PCAOrientation, centered
from copy import copy
import numpy as N
"""
A helper class and functions for grouped orientations
"""
class GroupedPlaneError(Exception):
    pass



# Path: attitude/orientation/pca.py
# def random_pca(scattered=True):
# def augment(matrix):
# def augment_vector(vec):
# def rotate_tensor(tensor,transform):
# def compose_affine(*transforms):
# def normalize(v):
# def axis_transform(pca_axes):
# def test_SVD(pca):
# def covariance_matrix(self):
#     def from_axes(axes):
#     def __init__(self, arr, weights=None,  axes=None):
#     def __run_svd(self):
#     def __load_saved_fit(self, axes):
#     def __compute_derived_parameters(self):
#     def U(self):
#     def eigenvalues(self):
#     def rotated(self):
#     def residuals(self):
#     def center(self):
#     def centered_array(self):
#     def hyperbolic_axes(self):
#     def angular_error(self, axis_length):
#     def angular_errors(self, degrees=True):
#     def _covariance_matrix(self, type='noise'):
#     def covariance_matrix(self):
#     def explained_variance(self):
#     def coefficients(self):
#     def azimuth(self):
#     def slope(self):
#     def _strike_dip(self):
#     def strike_dip(self, degrees=True):
#     def _rake(self):
#     def rake(self):
#     def strike_dip_rake(self):
#     def as_conic(self, level=1):
#     def as_hyperbola(self, rotated=False):
#     def _ellipse(self, level=1):
#     def plane_errors(self, **kwargs):
#     def error_coords(self, **kwargs):
#     def slope(self):
#     def error_ellipse(self, spherical=True, vector=False, level=1):
#     def to_mapping(self,**values):
#     def __repr__(self):
# class PCAOrientation(BaseOrientation):
#         R = augment(self.axes)
#             R = augment(self.axes)


# Path: attitude/orientation/grouped.py
from .pca import PCAOrientation, centered
from copy import copy
import numpy as N

"""
A helper class and functions for grouped orientations
"""
class GroupedPlaneError(Exception):
    pass



class GroupedOrientation(PCAOrientation):