org.tensorics.core.tensor.Coordinates Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tensorics-core Show documentation
Show all versions of tensorics-core Show documentation
Tensorics is a java framework which uses a tensor as a central object. A tensor represents a set of values placed in an N-dimensional space. Wherever you are tempted to use maps of maps, a tensor might be a good choice ;-) Tensorics provides methods to create, transform and performing calculations with those tensors.
// @formatter:off
/*******************************************************************************
*
* This file is part of tensorics.
*
* Copyright (c) 2008-2011, CERN. All rights reserved.
*
* 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
*
* http://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.
*
******************************************************************************/
// @formatter:on
package org.tensorics.core.tensor;
import static org.tensorics.core.util.MoreMultisets.containsNonUniqueElements;
import static org.tensorics.core.util.MoreMultisets.nonUniqueElementsOf;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.tensorics.core.util.Classes;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multiset;
/**
* Utility methods to handle coordinates
*
* @author kfuchsbe
*/
public final class Coordinates {
private Coordinates() {
/* only static methods */
}
/**
* Creates a class to instance map, from the given coordinates. The map will
* contain the classes of the coordinates as keys and the coordinates
* themselves as values. Duplicate keys (dimensions) are not allowed and
* will result in an {@link IllegalArgumentException}.
*
* @param coordinates
* the coordinates to be added to the map
* @return an immutable map from dimensions (coordinate classes) to
* coordinate
* @throws IllegalArgumentException
* if more than one coordinate per dimension are provided
*/
public static ClassToInstanceMap mapOf(Iterable coordinates) {
ImmutableClassToInstanceMap.Builder coordinateBuilder = ImmutableClassToInstanceMap.builder();
for (C coordinate : coordinates) {
@SuppressWarnings("unchecked")
Class coordinateClass = (Class) coordinate.getClass();
coordinateBuilder.put(coordinateClass, coordinate);
}
return coordinateBuilder.build();
}
/**
* Provides the way to reduce long classpath names of the coordinates
* classes to only short Class names. It produces a combination of the
* tensor and it's context result.
*
* @param tensor
* to extract the dimension set and reduce their length of the
* output string
* @return a reduced string
*/
public static String dimensionsWithoutClassPath(Tensor tensor) {
String dimensions = dimensionsWithoutClassPath(tensor.shape().dimensionSet());
String dimensionsContext = dimensionsWithoutClassPath(tensor.context().getPosition());
return "Tensor:" + dimensions + ", Context:" + dimensionsContext;
}
/**
* Provides the way to reduce long classpath names of the coordinates
* classes to only short Class names.
*
* @param position
* to extract the dimension set and reduce their ength of the
* output string
* @return a reduced string
*/
public static String dimensionsWithoutClassPath(Position position) {
return dimensionsWithoutClassPath(position.dimensionSet());
}
/**
* Provides the way to reduce long classpath names of the coordinates
* classes to only short Class names.
*
* @param dimensionSet
* to reduce length of the output string
* @return a reduced string
*/
public static String dimensionsWithoutClassPath(Set> dimensionSet) {
List classNames = new ArrayList();
for (Class oneClass : dimensionSet) {
classNames.add(oneClass.getSimpleName());
}
return classNames.toString();
}
public static Set requireValidCoordinates(Iterable coordinates) {
requireValidDimensions(Classes.classesOf(coordinates));
return ImmutableSet.copyOf(coordinates);
}
public static Set> requireValidDimensions(Multiset> dimensions) {
if (containsNonUniqueElements(dimensions)) {
throw new IllegalArgumentException(
"Only unique dimensions are allowed. The following dimensions are not unique: "
+ nonUniqueElementsOf(dimensions));
}
return ImmutableSet.copyOf(dimensions.elementSet());
}
}