Source code for besmarts.core.array_numpy


"""
besmarts.core.geometry_numpy.py
"""

from typing import Dict, List, Tuple
import numpy as np

from besmarts.core import topology
from besmarts.core import assignments

[docs] def b_matrix(pos, internals: Dict[topology.structure_topology, List]): pass
[docs] def g_matrix(pos, internals: Dict[topology.structure_topology, List]): pass
[docs] def dlc_matrix(pos, internals: Dict[topology.structure_topology, List], cutoff=1e-5): pass
[docs] def gradient_cartesian_to_internal_array(pos, gx, internals: Dict[topology.structure_topology, List]): pass
[docs] def gradient_cartesian_to_internal_matrix(pos, gx, internals: Dict[topology.structure_topology, List]): pass
[docs] def ginverse(G): ginv = np.zeros_like(G) u, v = np.linalg.eigh(G) for ui, vi in zip(u, v): if ui > 1e-1: ginv += np.outer(vi/ui,vi) return ginv
[docs] def dlcmatrix(gx, B): B = np.array(B) G = np.dot(B, B.T) ginv = ginverse(G) return ginv
[docs] def bmatrix_dense(valence, N): # N = len(valence.selections) conf = 0 B = [] for ic, confs in valence.selections.items(): brow = np.zeros(3*N) for i, nid in enumerate(ic): d = (nid-1)*3 brow[d:d+3] += confs[conf][i] B.append(brow) return dict(zip(valence.selections.keys(), B))
[docs] def bmatrix_ic(pos, jac): ics = jac(pos) return bmatrix_dense(ics, len(pos.selections))
[docs] def bmatrix_bonds(pos): return bmatrix_ic(pos, assignments.graph_assignment_jacobian_bonds)
[docs] def bmatrix_angles(pos): return bmatrix_ic(pos, assignments.graph_assignment_jacobian_angles)
[docs] def bmatrix_torsions(pos): return bmatrix_ic(pos, assignments.graph_assignment_jacobian_torsions)
[docs] def bmatrix_outofplanes(pos): return bmatrix_ic(pos, assignments.graph_assignment_jacobian_outofplanes)
[docs] def bmatrix_pairs(pos): return bmatrix_ic(pos, assignments.graph_assignment_jacobian_pairs)
[docs] def bmatrix(pos, bonds=True, angles=True, torsions=True, outofplanes=True, pairs=True) -> dict: B = {} if bonds: B.update(bmatrix_bonds(pos)) if angles: B.update(bmatrix_angles(pos)) if torsions: B.update(bmatrix_torsions(pos)) if outofplanes: B.update(bmatrix_outofplanes(pos)) if pairs: B.update(bmatrix_pairs(pos)) return B
[docs] def transform(B): B = np.array(B) G = np.dot(B, B.T) u, v = np.linalg.eigh(G) ginv = np.zeros_like(G) for ui, vi in zip(u, v): if ui > 1e-1: ginv += np.outer(vi/ui,vi) GB = np.dot(ginv, B) return GB.tolist()
[docs] def transform_dlcs(B): """ just use diag of inv G """ G = np.dot(B, B.T) G = G.round(12) u, v = np.linalg.eigh(G) u = u.round(12) v = v.round(12) return u, v
[docs] def transform_v2(B): """ just use diag of inv G """ B = np.array(B) G = np.dot(B, B.T) u, v = np.linalg.eigh(G) ginv = np.zeros_like(G) for ui, vi in zip(u, v): if ui > 1e-1: ginv += np.diag(vi*vi / ui) GB = np.dot(ginv, B) # MxN return GB.tolist()
[docs] def transform_v3(B): """ just use diag of G """ B = np.array(B) G = np.dot(B, B.T) G = np.diag(np.diag(G)) u, v = np.linalg.eigh(G) ginv = np.zeros_like(G) for ui, vi in zip(u, v): if ui > 1e-1: ginv += np.outer(vi/ui,vi) GB = np.dot(ginv, B) # MxN return GB.tolist()
[docs] def project_hessian(B, H): GB = transform_v2(B) return np.dot(np.dot(GB, H), GB.T)
[docs] def project_gradient(B, H): GB = transform_v2(B) return np.dot(np.dot(GB, H), GB.T)
[docs] def dlcmatrix_project_gradients(pos, gx, eps=1e-2): B = bmatrix(pos) B = np.vstack(list(B.values())) B = B.round(12) gx = np.atleast_2d(gx).T gx = gx.round(12) du, dv = transform_dlcs(B) gq = [] for ui, vi in zip(du, dv.T): if ui > eps: gb = np.dot(np.outer(vi/ui, vi), B) gb = gb.round(12) gb = np.dot(gb, gx).reshape(-1) gb = gb.round(12) gq.extend(gb.tolist()) return gq