
us.ihmc.scs2.sessionVisualizer.jfx.tools.YoVariableTools Maven / Gradle / Ivy
package us.ihmc.scs2.sessionVisualizer.jfx.tools;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import org.apache.commons.text.similarity.JaccardSimilarity;
import org.apache.commons.text.similarity.JaroWinklerDistance;
import org.apache.commons.text.similarity.LevenshteinDistance;
import org.apache.commons.text.similarity.LongestCommonSubsequence;
import org.apache.commons.text.similarity.SimilarityScore;
import us.ihmc.euclid.referenceFrame.ReferenceFrame;
import us.ihmc.scs2.sessionVisualizer.jfx.controllers.RegularExpression;
import us.ihmc.scs2.sessionVisualizer.jfx.controllers.yoComposite.search.SearchEngines;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint2D;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFramePoint3D;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameQuaternion;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameTuple2D;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameTuple3D;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector2D;
import us.ihmc.yoVariables.euclid.referenceFrame.YoFrameVector3D;
import us.ihmc.yoVariables.registry.YoRegistry;
import us.ihmc.yoVariables.registry.YoVariableHolder;
import us.ihmc.yoVariables.tools.YoGeometryNameTools;
import us.ihmc.yoVariables.variable.YoBoolean;
import us.ihmc.yoVariables.variable.YoDouble;
import us.ihmc.yoVariables.variable.YoInteger;
import us.ihmc.yoVariables.variable.YoVariable;
public class YoVariableTools
{
private static final boolean SORT_YO_VARIABLES = false;
public static long hashCode(YoRegistry registry)
{
long hashCode = 1L;
for (YoVariable yoVariable : registry.collectSubtreeVariables())
{
hashCode = 31L * hashCode + hashCode(yoVariable);
}
return hashCode;
}
public static long hashCode(YoVariable yoVariable)
{
return yoVariable.getFullNameString().hashCode();
}
public static List sortYoVariablesByName(Collection yoVariablesToSort)
{
return sortByName(yoVariablesToSort, YoVariable::getName);
}
public static List sortByName(Collection collection, Function nameGetter)
{
return collection.stream().sorted((e1, e2) -> nameGetter.apply(e1).compareTo(nameGetter.apply(e2))).collect(Collectors.toList());
}
public static List searchYoTuple2Ds(Collection extends YoVariable> yoVariablesToSearch, ReferenceFrame tuplesFrame)
{
String axisName = "x";
List yoDoubles = yoVariablesToSearch.stream().filter(YoDouble.class::isInstance).map(v -> (YoDouble) v).collect(Collectors.toList());
List xCoordinateCandidates = yoDoubles.stream().filter(v -> v.getName().toLowerCase().contains(axisName)).collect(Collectors.toList());
List foundYoTuple2Ds = new ArrayList<>();
for (YoDouble xCoordinateCandidate : xCoordinateCandidates)
{
String varName = xCoordinateCandidate.getName();
String varNameLowerCase = varName.toLowerCase();
String namespace = xCoordinateCandidate.getNamespace().toString();
int indexOfAxisName = varNameLowerCase.indexOf(axisName);
while (indexOfAxisName >= 0)
{
String prefix = varName.substring(0, indexOfAxisName);
String suffix;
if (indexOfAxisName + 1 < varName.length())
suffix = varName.substring(indexOfAxisName + 1, varName.length());
else
suffix = "";
YoFramePoint2D searchResult = findYoFramePoint2D(namespace, prefix, suffix, yoDoubles, tuplesFrame);
if (searchResult != null && !doesYoFrameTuple3DExist(namespace, prefix, suffix, yoDoubles)
&& !doesYoFrameQuaternionExist(namespace, prefix, suffix, yoDoubles))
foundYoTuple2Ds.add(searchResult);
if (indexOfAxisName + 1 >= varName.length())
break;
indexOfAxisName = varNameLowerCase.indexOf(axisName, indexOfAxisName + 1);
}
}
return foundYoTuple2Ds;
}
public static List searchYoTuple3Ds(Collection extends YoVariable> yoVariablesToSearch, ReferenceFrame tuplesFrame)
{
String axisName = "x";
List yoDoubles = yoVariablesToSearch.stream().filter(YoDouble.class::isInstance).map(v -> (YoDouble) v).collect(Collectors.toList());
List xCoordinateCandidates = yoDoubles.stream().filter(v -> v.getName().toLowerCase().contains(axisName)).collect(Collectors.toList());
List foundYoTuple3Ds = new ArrayList<>();
for (YoDouble xCoordinateCandidate : xCoordinateCandidates)
{
String varName = xCoordinateCandidate.getName();
String varNameLowerCase = varName.toLowerCase();
String namespace = xCoordinateCandidate.getNamespace().toString();
int indexOfAxisName = varNameLowerCase.indexOf(axisName);
while (indexOfAxisName >= 0)
{
String prefix = varName.substring(0, indexOfAxisName);
String suffix;
if (indexOfAxisName + 1 < varName.length())
suffix = varName.substring(indexOfAxisName + 1, varName.length());
else
suffix = "";
YoFramePoint3D searchResult = findYoFramePoint3D(namespace, prefix, suffix, yoDoubles, tuplesFrame);
if (searchResult != null && !doesYoFrameQuaternionExist(namespace, prefix, suffix, yoDoubles))
foundYoTuple3Ds.add(searchResult);
if (indexOfAxisName + 1 >= varName.length())
break;
indexOfAxisName = varNameLowerCase.indexOf(axisName, indexOfAxisName + 1);
}
}
return foundYoTuple3Ds;
}
public static List searchYoQuaternions(Collection extends YoVariable> yoVariablesToSearch, ReferenceFrame tuplesFrame)
{
String axisName = "x";
List yoDoubles = yoVariablesToSearch.stream().filter(YoDouble.class::isInstance).map(v -> (YoDouble) v).collect(Collectors.toList());
List xCoordinateCandidates = yoDoubles.stream().filter(v -> v.getName().toLowerCase().contains(axisName)).collect(Collectors.toList());
List foundYoTuple3Ds = new ArrayList<>();
for (YoDouble xCoordinateCandidate : xCoordinateCandidates)
{
String varName = xCoordinateCandidate.getName();
String varNameLowerCase = varName.toLowerCase();
String namespace = xCoordinateCandidate.getNamespace().toString();
int indexOfAxisName = varNameLowerCase.indexOf(axisName);
while (indexOfAxisName >= 0)
{
String prefix = varName.substring(0, indexOfAxisName);
String suffix;
if (indexOfAxisName + 1 < varName.length())
suffix = varName.substring(indexOfAxisName + 1, varName.length());
else
suffix = "";
YoFrameQuaternion searchResult = findYoFrameQuaternion(namespace, prefix, suffix, yoDoubles, tuplesFrame);
if (searchResult != null)
foundYoTuple3Ds.add(searchResult);
if (indexOfAxisName + 1 >= varName.length())
break;
indexOfAxisName = varNameLowerCase.indexOf(axisName, indexOfAxisName + 1);
}
}
return foundYoTuple3Ds;
}
public static boolean doesYoFrameTuple2DExist(String namespace, String prefix, String suffix, Collection extends YoVariable> yoVariablesToSearch)
{
return findYoFramePoint2D(namespace, prefix, suffix, yoVariablesToSearch, null) != null;
}
public static boolean doesYoFrameTuple2DExist(String namespace, String prefix, String suffix, YoVariableHolder yoVariableHolder)
{
return findYoFramePoint2D(namespace, prefix, suffix, yoVariableHolder, null) != null;
}
public static boolean doesYoFrameTuple3DExist(String namespace, String prefix, String suffix, Collection extends YoVariable> yoVariablesToSearch)
{
return findYoFramePoint3D(namespace, prefix, suffix, yoVariablesToSearch, null) != null;
}
public static boolean doesYoFrameTuple3DExist(String namespace, String prefix, String suffix, YoVariableHolder yoVariableHolder)
{
return findYoFramePoint3D(namespace, prefix, suffix, yoVariableHolder, null) != null;
}
public static boolean doesYoFrameQuaternionExist(String namespace, String prefix, String suffix, Collection extends YoVariable> yoVariablesToSearch)
{
return findYoFrameQuaternion(namespace, prefix, suffix, yoVariablesToSearch, null) != null;
}
public static boolean doesYoFrameQuaternionExist(String namespace, String prefix, String suffix, YoVariableHolder yoVariableHolder)
{
return findYoFrameQuaternion(namespace, prefix, suffix, yoVariableHolder, null) != null;
}
public static YoFramePoint2D findYoFramePoint2D(String namespace,
String prefix,
String suffix,
Collection extends YoVariable> yoVariablesToSearch,
ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariablesToSearch);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariablesToSearch);
if (y == null)
return null;
return new YoFramePoint2D(x, y, tupleFrame);
}
public static YoFramePoint2D findYoFramePoint2D(String namespace, String prefix, String suffix, YoVariableHolder yoVariableHolder, ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariableHolder);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariableHolder);
if (y == null)
return null;
return new YoFramePoint2D(x, y, tupleFrame);
}
public static YoFrameVector2D findYoFrameVector2D(String namespace,
String prefix,
String suffix,
Collection extends YoVariable> yoVariablesToSearch,
ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariablesToSearch);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariablesToSearch);
if (y == null)
return null;
return new YoFrameVector2D(x, y, tupleFrame);
}
public static YoFrameVector2D findYoFrameVector2D(String namespace,
String prefix,
String suffix,
YoVariableHolder yoVariableHolder,
ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariableHolder);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariableHolder);
if (y == null)
return null;
return new YoFrameVector2D(x, y, tupleFrame);
}
public static YoFramePoint3D findYoFramePoint3D(String namespace,
String prefix,
String suffix,
Collection extends YoVariable> yoVariablesToSearch,
ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariablesToSearch);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariablesToSearch);
if (y == null)
return null;
YoDouble z = findYoDouble(namespace, YoGeometryNameTools.createZName(prefix, suffix), yoVariablesToSearch);
if (z == null)
return null;
return new YoFramePoint3D(x, y, z, tupleFrame);
}
public static YoFramePoint3D findYoFramePoint3D(String namespace, String prefix, String suffix, YoVariableHolder yoVariableHolder, ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariableHolder);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariableHolder);
if (y == null)
return null;
YoDouble z = findYoDouble(namespace, YoGeometryNameTools.createZName(prefix, suffix), yoVariableHolder);
if (z == null)
return null;
return new YoFramePoint3D(x, y, z, tupleFrame);
}
public static YoFrameVector3D findYoFrameVector3D(String namespace,
String prefix,
String suffix,
Collection extends YoVariable> yoVariablesToSearch,
ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariablesToSearch);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariablesToSearch);
if (y == null)
return null;
YoDouble z = findYoDouble(namespace, YoGeometryNameTools.createZName(prefix, suffix), yoVariablesToSearch);
if (z == null)
return null;
return new YoFrameVector3D(x, y, z, tupleFrame);
}
public static YoFrameVector3D findYoFrameVector3D(String namespace,
String prefix,
String suffix,
YoVariableHolder yoVariableHolder,
ReferenceFrame tupleFrame)
{
YoDouble x = findYoDouble(namespace, YoGeometryNameTools.createXName(prefix, suffix), yoVariableHolder);
if (x == null)
return null;
YoDouble y = findYoDouble(namespace, YoGeometryNameTools.createYName(prefix, suffix), yoVariableHolder);
if (y == null)
return null;
YoDouble z = findYoDouble(namespace, YoGeometryNameTools.createZName(prefix, suffix), yoVariableHolder);
if (z == null)
return null;
return new YoFrameVector3D(x, y, z, tupleFrame);
}
public static YoFrameQuaternion findYoFrameQuaternion(String namespace,
String prefix,
String suffix,
Collection extends YoVariable> yoVariablesToSearch,
ReferenceFrame tupleFrame)
{
YoDouble qx = findYoDouble(namespace, YoGeometryNameTools.createQxName(prefix, suffix), yoVariablesToSearch);
if (qx == null)
return null;
YoDouble qy = findYoDouble(namespace, YoGeometryNameTools.createQyName(prefix, suffix), yoVariablesToSearch);
if (qy == null)
return null;
YoDouble qz = findYoDouble(namespace, YoGeometryNameTools.createQzName(prefix, suffix), yoVariablesToSearch);
if (qz == null)
return null;
YoDouble qs = findYoDouble(namespace, YoGeometryNameTools.createQsName(prefix, suffix), yoVariablesToSearch);
if (qs == null)
return null;
return new YoFrameQuaternion(qx, qy, qz, qs, tupleFrame);
}
public static YoFrameQuaternion findYoFrameQuaternion(String namespace,
String prefix,
String suffix,
YoVariableHolder yoVariableHolder,
ReferenceFrame tupleFrame)
{
YoDouble qx = findYoDouble(namespace, YoGeometryNameTools.createQxName(prefix, suffix), yoVariableHolder);
if (qx == null)
return null;
YoDouble qy = findYoDouble(namespace, YoGeometryNameTools.createQyName(prefix, suffix), yoVariableHolder);
if (qy == null)
return null;
YoDouble qz = findYoDouble(namespace, YoGeometryNameTools.createQzName(prefix, suffix), yoVariableHolder);
if (qz == null)
return null;
YoDouble qs = findYoDouble(namespace, YoGeometryNameTools.createQsName(prefix, suffix), yoVariableHolder);
if (qs == null)
return null;
return new YoFrameQuaternion(qx, qy, qz, qs, tupleFrame);
}
public static YoDouble findYoDouble(String namespace, String name, YoVariableHolder yoVariableHolder)
{
return findYoVariable(namespace, name, YoDouble.class, yoVariableHolder);
}
public static YoDouble findYoDouble(String namespace, String name, Collection extends YoVariable> yoVariablesToSearch)
{
return findYoVariable(namespace, name, YoDouble.class, yoVariablesToSearch);
}
public static YoInteger findYoInteger(String namespace, String name, YoVariableHolder yoVariableHolder)
{
return findYoVariable(namespace, name, YoInteger.class, yoVariableHolder);
}
public static YoInteger findYoInteger(String namespace, String name, Collection extends YoVariable> yoVariablesToSearch)
{
return findYoVariable(namespace, name, YoInteger.class, yoVariablesToSearch);
}
public static YoBoolean findYoBoolean(String namespace, String name, YoVariableHolder yoVariableHolder)
{
return findYoVariable(namespace, name, YoBoolean.class, yoVariableHolder);
}
public static YoBoolean findYoBoolean(String namespace, String name, Collection extends YoVariable> yoVariablesToSearch)
{
return findYoVariable(namespace, name, YoBoolean.class, yoVariablesToSearch);
}
@SuppressWarnings("unchecked")
public static T findYoVariable(String namespace, String name, Class clazz, Collection extends YoVariable> yoVariablesToSearch)
{
YoVariable uncheckedVariable = yoVariablesToSearch.stream().filter(v -> v.getName().equals(name))
.filter(v -> v.getNamespace().toString().equals(namespace)).findFirst().orElse(null);
if (uncheckedVariable == null)
return null;
if (!clazz.isInstance(uncheckedVariable))
return null;
return (T) uncheckedVariable;
}
@SuppressWarnings("unchecked")
public static T findYoVariable(String namespace, String name, Class clazz, YoVariableHolder yoVariableHolder)
{
YoVariable uncheckedVariable = yoVariableHolder.findVariable(namespace, name);
if (uncheckedVariable == null)
return null;
if (!clazz.isInstance(uncheckedVariable))
return null;
return (T) uncheckedVariable;
}
public static List search(Collection collectionToSearch,
Function stringConverter,
String searchQuery,
SimilarityScore extends Number> searchEngine,
int maxResults)
{
return search(collectionToSearch, stringConverter, searchQuery, searchEngine, maxResults, Collectors.toList(), null);
}
public static List search(Collection collectionToSearch,
Function stringConverter,
String searchQuery,
SimilarityScore extends Number> searchEngine,
int maxResults,
List scoresToPack)
{
return search(collectionToSearch, stringConverter, searchQuery, searchEngine, maxResults, Collectors.toList(), scoresToPack);
}
public static R search(Collection collectionToSearch,
Function stringConverter,
String searchQuery,
SimilarityScore extends Number> searchEngine,
int maxResults,
Collector collector)
{
return search(collectionToSearch, stringConverter, searchQuery, searchEngine, maxResults, collector, null);
}
public static R search(Collection collectionToSearch,
Function stringConverter,
String searchQuery,
SimilarityScore extends Number> searchEngine,
int maxResults,
Collector collector,
List scoresToPack)
{
if (collectionToSearch == null || collectionToSearch.isEmpty())
return null;
PriorityQueue> scoredItemQueue = new PriorityQueue<>(collectionToSearch.size());
for (T itemToScore : collectionToSearch)
{
if (Thread.interrupted())
{
System.out.println("Search interrupted 1");
return null;
}
Number score = searchEngine.apply(stringConverter.apply(itemToScore), searchQuery);
if (score.doubleValue() > 0.0)
scoredItemQueue.add(new ScoredObject(itemToScore, score));
}
List> scoredItems = scoredItemQueue.stream().limit(maxResults).collect(Collectors.toList());
int startIndex = 0;
int endIndex = 0;
while (endIndex < scoredItems.size() - 1)
{
if (Thread.interrupted())
{
System.out.println("Search interrupted 2");
return null;
}
for (int i = startIndex;; i++)
{
if (i > scoredItems.size() - 2)
{
endIndex = i;
break;
}
ScoredObject scoredItem = scoredItems.get(i);
ScoredObject nextScoredItem = scoredItems.get(i + 1);
if (!scoredItem.getScore().equals(nextScoredItem.getScore()))
{
endIndex = i;
break;
}
}
if (Thread.interrupted())
{
System.out.println("Search interrupted 3");
return null;
}
if (SORT_YO_VARIABLES)
{
if (endIndex - startIndex > 1)
Collections.sort(scoredItems.subList(startIndex, endIndex + 1),
(o1, o2) -> stringConverter.apply(o1.getObject()).toLowerCase().compareTo(stringConverter.apply(o2.getObject()).toLowerCase()));
}
startIndex = endIndex + 1;
}
if (scoresToPack != null)
{
scoresToPack.clear();
for (ScoredObject scoredObject : scoredItems)
{
scoresToPack.add(scoredObject.getScore());
}
}
return scoredItems.stream().map(ScoredObject::getObject).collect(collector);
}
public static SimilarityScore extends Number> fromSearchEnginesEnum(SearchEngines searchEngine)
{
switch (searchEngine)
{
case DEFAULT:
return new SimilarityScore()
{
@Override
public Number apply(CharSequence left, CharSequence right)
{
return RegularExpression.check(left.toString(), right.toString()) ? 1.0 : 0.0;
}
};
case JACCARD:
return new JaccardSimilarity();
case COSINE:
return null;
case HAMMING:
return new JaroWinklerDistance();
case LEVENSHTEIN:
return new LevenshteinDistance();
case SUBSEQUENCE:
return new LongestCommonSubsequence();
default:
throw new UnsupportedOperationException("Unsupported search method: " + searchEngine);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy