Source code for geometry.manifolds.manifold_relations

from collections import defaultdict, namedtuple

__all__ = ['ManifoldRelations', 'Isomorphism', 'Embedding']

Isomorphism = namedtuple('Isomorphism',
                         'A B A_to_B B_to_A steps type desc')
Embedding = namedtuple('Embedding',
                       'A B A_to_B B_to_A steps type desc')


# Before: we used A._embedding[B]; now we use an external variable
# so that we use _IsomorphismRels[A][B]
[docs]class ManifoldRelations(object): _key_to_manifold = dict() _isomorphism_rels = defaultdict(dict) _embedding_rels = defaultdict(dict) _projection_rels = defaultdict(dict)
[docs] @staticmethod def set_isomorphism(A, B, iso): assert iso.A == A assert iso.B == B A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) ManifoldRelations._isomorphism_rels[A][B] = iso
[docs] @staticmethod def get_isomorphism(A, B): A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) return ManifoldRelations._isomorphism_rels[A][B]
[docs] @staticmethod def exists_isomorphism(A, B): A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) return B in ManifoldRelations._isomorphism_rels[A]
[docs] @staticmethod def all_isomorphisms(A): A = ManifoldRelations._get_key(A) return map(ManifoldRelations._manifold_from_key, ManifoldRelations._isomorphism_rels[A].keys())
# emabedding
[docs] @staticmethod def set_embedding(A, B, em): assert em.A == A assert em.B == B A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) ManifoldRelations._embedding_rels[A][B] = em
[docs] @staticmethod def get_embedding(A, B): A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) return ManifoldRelations._embedding_rels[A][B]
[docs] @staticmethod def exists_embedding(A, B): A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) return B in ManifoldRelations._embedding_rels[A]
[docs] @staticmethod def all_embeddings(A): A = ManifoldRelations._get_key(A) return map(ManifoldRelations._manifold_from_key, ManifoldRelations._embedding_rels[A].keys())
# projections
[docs] @staticmethod def set_projection(A, B, proj): assert proj.A == A assert proj.B == B A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) ManifoldRelations._projection_rels[A][B] = proj
[docs] @staticmethod def get_projection(A, B): A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) return ManifoldRelations._projection_rels[A][B]
[docs] @staticmethod def exists_projection(A, B): A = ManifoldRelations._get_key(A) B = ManifoldRelations._get_key(B) return B in ManifoldRelations._projection_rels[A]
[docs] @staticmethod def all_projections(A): A = ManifoldRelations._get_key(A) return map(ManifoldRelations._manifold_from_key, ManifoldRelations._projection_rels[A].keys())
@staticmethod def _get_key(M): """ Returns the string used for identifying a manifold """ from .differentiable_manifold import DifferentiableManifold assert isinstance(M, DifferentiableManifold) k = str(M) if not k in ManifoldRelations._key_to_manifold: ManifoldRelations._key_to_manifold[k] = M return k @staticmethod def _manifold_from_key(k): M = ManifoldRelations._key_to_manifold[k] from .differentiable_manifold import DifferentiableManifold assert isinstance(M, DifferentiableManifold) return M
[docs] @staticmethod def relations_descriptions(M): M = ManifoldRelations._get_key(M) _embedding = ManifoldRelations._embedding_rels[M] _isomorphism = ManifoldRelations._isomorphism_rels[M] _projection = ManifoldRelations._projection_rels[M] s = ('[= %s >= %s <= %s]' % (" ".join([str(a) for a in _isomorphism]), " ".join([str(a) for a in _projection]), " ".join([str(a) for a in _embedding]))) return s
[docs] @staticmethod def project(A, B, a_point): projection = ManifoldRelations.get_projection(A, B) x = projection.A_to_B(a_point) return x