Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import ai.timefold.solver.core.config.constructionheuristic.ConstructionHeuristicPhaseConfig;
import ai.timefold.solver.core.config.heuristic.selector.entity.EntitySelectorConfig;
import ai.timefold.solver.core.config.heuristic.selector.value.ValueSelectorConfig;
import ai.timefold.solver.core.impl.heuristic.move.Move;
import ai.timefold.solver.core.impl.heuristic.selector.Selector;
import ai.timefold.solver.core.preview.api.move.Move;

import org.jspecify.annotations.NullMarked;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
import ai.timefold.solver.core.api.score.director.ScoreDirector;
import ai.timefold.solver.core.api.solver.change.ProblemChange;
import ai.timefold.solver.core.impl.heuristic.move.Move;
import ai.timefold.solver.core.preview.api.move.Move;

/**
* Specifies that a bean property (or a field) is the id to match
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand All @@ -14,7 +15,6 @@
import ai.timefold.solver.core.api.score.constraint.ConstraintRef;
import ai.timefold.solver.core.api.score.stream.ConstraintJustification;
import ai.timefold.solver.core.api.solver.SolutionManager;
import ai.timefold.solver.core.impl.util.CollectionUtils;

import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
Expand Down Expand Up @@ -154,8 +154,9 @@ private static int getMatchCount(ConstraintAnalysis<?> analysis, ConstraintAnaly

private static <Score_ extends Score<Score_>> Map<ConstraintJustification, MatchAnalysis<Score_>>
mapMatchesToJustifications(List<MatchAnalysis<Score_>> matchAnalyses) {

Map<ConstraintJustification, MatchAnalysis<Score_>> matchAnalysisMap =
CollectionUtils.newLinkedHashMap(matchAnalyses.size());
LinkedHashMap.newLinkedHashMap(matchAnalyses.size());
for (var matchAnalysis : matchAnalyses) {
var previous = matchAnalysisMap.put(matchAnalysis.justification(), matchAnalysis);
if (previous != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import ai.timefold.solver.core.api.score.Score;
import ai.timefold.solver.core.api.solver.Solver;
import ai.timefold.solver.core.api.solver.event.BestSolutionChangedEvent;
import ai.timefold.solver.core.impl.heuristic.move.Move;
import ai.timefold.solver.core.preview.api.move.Move;

import org.jspecify.annotations.NullMarked;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import ai.timefold.solver.core.api.domain.entity.PlanningEntity;
import ai.timefold.solver.core.api.domain.variable.ShadowVariable;
import ai.timefold.solver.core.api.solver.Solver;
import ai.timefold.solver.core.impl.heuristic.move.Move;
import ai.timefold.solver.core.impl.score.director.InnerScoreDirector;
import ai.timefold.solver.core.preview.api.move.Move;

/**
* The environment mode also allows you to detect common bugs in your implementation.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import ai.timefold.solver.core.impl.bavet.common.tuple.Tuple;
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleLifecycle;
import ai.timefold.solver.core.impl.bavet.common.tuple.TupleState;
import ai.timefold.solver.core.impl.util.CollectionUtils;

public abstract class AbstractFlattenNode<InTuple_ extends Tuple, OutTuple_ extends Tuple, FlattenedItem_>
extends AbstractNode
Expand Down Expand Up @@ -124,7 +123,8 @@ private record FlattenBagByItem<FlattenedItem_, OutTuple_>(
}

FlattenBagByItem(int size) {
this(CollectionUtils.newLinkedHashMap(size));

this(LinkedHashMap.newLinkedHashMap(size));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public RecordAndReplayPropagator(Supplier<BavetPrecomputeBuildHelper<Tuple_>> pr
UnaryOperator<Tuple_> internalTupleToOutputTupleMapper, TupleLifecycle<Tuple_> nextNodesTupleLifecycle, int size) {
this.precomputeBuildHelperSupplier = precomputeBuildHelperSupplier;
this.internalTupleToOutputTupleMapper = internalTupleToOutputTupleMapper;
this.objectToOutputTuplesMap = CollectionUtils.newIdentityHashMap(size);
this.objectToOutputTuplesMap = new IdentityHashMap<>(size);

// Guesstimate that updates are dominant.
this.retractQueue = CollectionUtils.newIdentityHashSet(size / 20);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
import ai.timefold.solver.core.impl.constructionheuristic.scope.ConstructionHeuristicPhaseScope;
import ai.timefold.solver.core.impl.constructionheuristic.scope.ConstructionHeuristicStepScope;
import ai.timefold.solver.core.impl.heuristic.move.MoveAdapters;
import ai.timefold.solver.core.impl.heuristic.move.NoChangeMove;
import ai.timefold.solver.core.impl.heuristic.move.SelectorBasedNoChangeMove;
import ai.timefold.solver.core.impl.heuristic.selector.move.generic.SelectorBasedChangeMove;
import ai.timefold.solver.core.impl.phase.scope.SolverLifecyclePoint;
import ai.timefold.solver.core.impl.solver.scope.SolverScope;
import ai.timefold.solver.core.impl.solver.termination.PhaseTermination;
Expand Down Expand Up @@ -130,8 +131,8 @@ public void decideNextStep(ConstructionHeuristicStepScope<Solution_> stepScope,
}

private static <Solution_> boolean isAllowedNonDoableMove(Move<Solution_> move) {
return MoveAdapters.testWhenLegacyMove(move, legacyMove -> legacyMove instanceof NoChangeMove<Solution_>
|| legacyMove instanceof ai.timefold.solver.core.impl.heuristic.selector.move.generic.ChangeMove<Solution_>);
return MoveAdapters.testWhenLegacyMove(move, legacyMove -> legacyMove instanceof SelectorBasedNoChangeMove<Solution_>
|| legacyMove instanceof SelectorBasedChangeMove<Solution_>);
}

protected void pickMove(ConstructionHeuristicStepScope<Solution_> stepScope) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,6 @@
*/
public class Placement<Solution_> implements Iterable<Move<Solution_>> {

@SuppressWarnings({ "unchecked", "rawtypes" })
public static <Solution_> Iterator<ai.timefold.solver.core.preview.api.move.Move<Solution_>>
toNewMoveIterator(Iterator<ai.timefold.solver.core.impl.heuristic.move.Move<Solution_>> legacyIterator) {
return (Iterator) legacyIterator;
}

private final Iterator<Move<Solution_>> moveIterator;

public Placement(Iterator<Move<Solution_>> moveIterator) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import java.util.Iterator;

import ai.timefold.solver.core.impl.heuristic.HeuristicConfigPolicy;
import ai.timefold.solver.core.impl.heuristic.move.Move;
import ai.timefold.solver.core.impl.heuristic.selector.common.decorator.SelectionFilter;
import ai.timefold.solver.core.impl.heuristic.selector.common.iterator.UpcomingSelectionIterator;
import ai.timefold.solver.core.impl.heuristic.selector.move.MoveSelector;
import ai.timefold.solver.core.impl.heuristic.selector.move.decorator.FilteringMoveSelector;
import ai.timefold.solver.core.preview.api.move.Move;

public class PooledEntityPlacer<Solution_> extends AbstractEntityPlacer<Solution_> implements EntityPlacer<Solution_> {

Expand Down Expand Up @@ -41,7 +41,7 @@ protected Placement<Solution_> createUpcomingSelection() {
if (!moveIterator.hasNext()) {
return noUpcomingSelection();
}
return new Placement<>(Placement.toNewMoveIterator(moveIterator));
return new Placement<>(moveIterator);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import java.util.List;

import ai.timefold.solver.core.impl.heuristic.HeuristicConfigPolicy;
import ai.timefold.solver.core.impl.heuristic.move.Move;
import ai.timefold.solver.core.impl.heuristic.selector.common.decorator.SelectionFilter;
import ai.timefold.solver.core.impl.heuristic.selector.common.iterator.UpcomingSelectionIterator;
import ai.timefold.solver.core.impl.heuristic.selector.entity.EntitySelector;
import ai.timefold.solver.core.impl.heuristic.selector.entity.decorator.FilteringEntitySelector;
import ai.timefold.solver.core.impl.heuristic.selector.move.MoveSelector;
import ai.timefold.solver.core.preview.api.move.Move;

public class QueuedEntityPlacer<Solution_> extends AbstractEntityPlacer<Solution_> implements EntityPlacer<Solution_> {

Expand Down Expand Up @@ -66,7 +66,7 @@ protected Placement<Solution_> createUpcomingSelection() {
MoveSelector<Solution_> moveSelector = moveSelectorIterator.next();
moveIterator = moveSelector.iterator();
}
return new Placement<>(Placement.toNewMoveIterator(moveIterator));
return new Placement<>(moveIterator);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ protected Placement<Solution_> createUpcomingSelection() {
if (!moveIterator.hasNext()) {
return noUpcomingSelection();
}
return new Placement<>(Placement.toNewMoveIterator(moveIterator));
return new Placement<>(moveIterator);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
import ai.timefold.solver.core.impl.heuristic.selector.common.decorator.ComparatorSelectionSorter;
import ai.timefold.solver.core.impl.heuristic.selector.common.decorator.SelectionSorter;
import ai.timefold.solver.core.impl.move.MoveDirector;
import ai.timefold.solver.core.impl.util.CollectionUtils;
import ai.timefold.solver.core.impl.util.MutableInt;
import ai.timefold.solver.core.preview.api.domain.metamodel.PlanningEntityMetaModel;
import ai.timefold.solver.core.preview.api.neighborhood.stream.function.UniNeighborhoodsPredicate;
Expand Down Expand Up @@ -486,7 +485,8 @@ Maybe remove the variables (%s) from the class (%s).""".formatted(entityClass,
redefinedShadowVariables, redefinedShadowVariables, entityClass));
}
effectiveShadowVariableDescriptorMap.putAll(declaredShadowVariableDescriptorMap);
effectiveVariableDescriptorMap = CollectionUtils

effectiveVariableDescriptorMap = LinkedHashMap
.newLinkedHashMap(effectiveGenuineVariableDescriptorMap.size() + effectiveShadowVariableDescriptorMap.size());
effectiveVariableDescriptorMap.putAll(effectiveGenuineVariableDescriptorMap);
effectiveVariableDescriptorMap.putAll(effectiveShadowVariableDescriptorMap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
import java.util.Deque;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
Expand All @@ -28,7 +31,6 @@
import ai.timefold.solver.core.api.domain.solution.cloner.SolutionCloner;
import ai.timefold.solver.core.impl.domain.common.accessor.MemberAccessor;
import ai.timefold.solver.core.impl.domain.solution.descriptor.SolutionDescriptor;
import ai.timefold.solver.core.impl.util.CollectionUtils;
import ai.timefold.solver.core.impl.util.ConcurrentMemoization;

import org.jspecify.annotations.NonNull;
Expand Down Expand Up @@ -59,7 +61,7 @@ public FieldAccessingSolutionCloner(SolutionDescriptor<Solution_> solutionDescri
@Override
public @NonNull Solution_ cloneSolution(@NonNull Solution_ originalSolution) {
var expectedObjectCount = expectedObjectCountRef.get();
var originalToCloneMap = CollectionUtils.newIdentityHashMap(expectedObjectCount);
var originalToCloneMap = new IdentityHashMap<>(expectedObjectCount);
var unprocessedQueue = new ArrayDeque<Unprocessed>(expectedObjectCount);
var cloneSolution = clone(originalSolution, originalToCloneMap, unprocessedQueue,
retrieveClassMetadata(originalSolution.getClass()));
Expand Down Expand Up @@ -235,9 +237,9 @@ public static <E> Collection<E> constructCloneCollection(Collection<E> originalC
} else if (!(originalCollection instanceof LinkedHashSet)) {
// Set is explicitly not ordered, so we can use a HashSet.
// Can be replaced by checking for SequencedSet, but that is Java 21+.
return CollectionUtils.newHashSet(size);
return HashSet.newHashSet(size);
} else { // Default to a LinkedHashSet to respect order.
return CollectionUtils.newLinkedHashSet(size);
return LinkedHashSet.newLinkedHashSet(size);
}
} else if (originalCollection instanceof Deque) {
return new ArrayDeque<>(size);
Expand Down Expand Up @@ -298,9 +300,10 @@ public static <K, V> Map<K, V> constructCloneMap(Map<K, V> originalMap) {
if (!(originalMap instanceof LinkedHashMap<?, ?>)) {
// Map is explicitly not ordered, so we can use a HashMap.
// Can be replaced by checking for SequencedMap, but that is Java 21+.
return CollectionUtils.newHashMap(originalMapSize);
return HashMap.newHashMap(originalMapSize);
} else { // Default to a LinkedHashMap to respect order.
return CollectionUtils.newLinkedHashMap(originalMapSize);

return LinkedHashMap.newLinkedHashMap(originalMapSize);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.random.RandomGenerator;

import ai.timefold.solver.core.impl.domain.valuerange.sort.ValueRangeSorter;
import ai.timefold.solver.core.impl.heuristic.selector.common.iterator.CachedListRandomIterator;
import ai.timefold.solver.core.impl.util.CollectionUtils;

import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
Expand All @@ -19,11 +19,11 @@ public final class ValueRangeCache<Value_>
implements Iterable<Value_> {

public static <Value_> ValueRangeCache<Value_> of(int size) {
return new ValueRangeCache<>(size, CollectionUtils.newHashSet(size));
return new ValueRangeCache<>(size, HashSet.newHashSet(size));
}

public static <Value_> ValueRangeCache<Value_> of(Collection<Value_> collection) {
return new ValueRangeCache<>(collection, CollectionUtils.newHashSet(collection.size()));
return new ValueRangeCache<>(collection, HashSet.newHashSet(collection.size()));
}

public static <Value_> ValueRangeCache<Value_> of(List<Value_> valuesWithFastRandomAccess,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ai.timefold.solver.core.impl.domain.variable;

import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
Expand Down Expand Up @@ -61,7 +62,7 @@ public void initialize(InnerScoreDirector<Solution_, ?> scoreDirector, int initi
|| externalizedPreviousElementProcessor == null || externalizedNextElementProcessor == null;
if (requiresPositionMap) {
if (elementPositionMap == null) {
elementPositionMap = CollectionUtils.newIdentityHashMap(unassignedCount);
elementPositionMap = new IdentityHashMap<>(unassignedCount);
} else {
elementPositionMap.clear();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.PrimitiveIterator;
import java.util.Set;
import java.util.stream.Collectors;

import ai.timefold.solver.core.impl.util.CollectionUtils;
import ai.timefold.solver.core.impl.util.MutableInt;

public class DefaultTopologicalOrderGraph implements TopologicalOrderGraph {
Expand All @@ -23,7 +23,8 @@ public class DefaultTopologicalOrderGraph implements TopologicalOrderGraph {
@SuppressWarnings({ "unchecked" })
public DefaultTopologicalOrderGraph(final int size) {
this.nodeIdToTopologicalOrderMap = new int[size];
this.componentMap = CollectionUtils.newLinkedHashMap(size);

this.componentMap = LinkedHashMap.newLinkedHashMap(size);
this.forwardEdges = new Set[size];
this.backEdges = new Set[size];
this.isNodeInLoopedComponent = new boolean[size];
Expand Down
Loading
Loading