Source code for renn.analysis_utils

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Utilities for analysis."""

from collections import defaultdict
from itertools import product
import numpy as np

__all__ = ['pseudogrid']


[docs]def pseudogrid(coordinates, dimension): """Constructs a pseudogrid ('pseudo' in that it is not necessarily evenly-spaced) of points in 'dimension'-dimension space from the specified coordinates. Arguments: coordinates: a mapping between dimensions and coordinates in those dimensions dimension: number of dimensions For all dimensions that are not specified, the coordinate is taken to be 0. Example: if coordinates = {0: [0, 1, 2], 2: [1]}, and dimension = 4, the coordinates in dimensions 1 and 3 will be taken as [0], yielding the effective coordinate-dictionary coordinates = {0: [0,1,2], 1: [0], 2: [1], 3: [0]} Then the resulting pseudogrid will be constructed as: [[0,0,1,0], [1,0,1,0], [2,0,1,0]] """ all_coordinates = defaultdict(lambda: np.array(0.0)) all_coordinates.update(coordinates) max_specified_dim = max(coordinates.keys()) if max_specified_dim > 32: raise NotImplementedError('Maximum specified dimension cannot exceed 32') points = np.meshgrid( *[all_coordinates[i] for i in range(max_specified_dim + 1)]) points = np.stack(points).reshape(max_specified_dim + 1, -1).T padding = np.zeros((points.shape[0], dimension - max_specified_dim - 1)) return np.concatenate((points, padding), axis=1)