1818import ai .timefold .solver .core .impl .domain .variable .descriptor .GenuineVariableDescriptor ;
1919import ai .timefold .solver .core .impl .domain .variable .descriptor .ListVariableDescriptor ;
2020import ai .timefold .solver .core .impl .heuristic .HeuristicConfigPolicy ;
21- import ai .timefold .solver .core .impl .heuristic .selector .entity .EntitySelector ;
2221import ai .timefold .solver .core .impl .heuristic .selector .entity .EntitySelectorFactory ;
2322import ai .timefold .solver .core .impl .heuristic .selector .move .AbstractMoveSelectorFactory ;
2423import ai .timefold .solver .core .impl .heuristic .selector .move .MoveSelector ;
2524import ai .timefold .solver .core .impl .heuristic .selector .move .generic .list .ListChangeMoveSelectorFactory ;
26- import ai .timefold .solver .core .impl .heuristic .selector .value .ValueSelector ;
2725import ai .timefold .solver .core .impl .heuristic .selector .value .ValueSelectorFactory ;
2826
2927import org .slf4j .Logger ;
@@ -43,11 +41,11 @@ protected MoveSelector<Solution_> buildBaseMoveSelector(HeuristicConfigPolicy<So
4341 SelectionCacheType minimumCacheType , boolean randomSelection ) {
4442 checkUnfolded ("entitySelectorConfig" , config .getEntitySelectorConfig ());
4543 checkUnfolded ("valueSelectorConfig" , config .getValueSelectorConfig ());
46- SelectionOrder selectionOrder = SelectionOrder .fromRandomSelectionBoolean (randomSelection );
47- EntitySelector < Solution_ > entitySelector = EntitySelectorFactory
44+ var selectionOrder = SelectionOrder .fromRandomSelectionBoolean (randomSelection );
45+ var entitySelector = EntitySelectorFactory
4846 .<Solution_ > create (config .getEntitySelectorConfig ())
4947 .buildEntitySelector (configPolicy , minimumCacheType , selectionOrder );
50- ValueSelector < Solution_ > valueSelector = ValueSelectorFactory
48+ var valueSelector = ValueSelectorFactory
5149 .<Solution_ > create (config .getValueSelectorConfig ())
5250 .buildValueSelector (configPolicy , entitySelector .getEntityDescriptor (), minimumCacheType , selectionOrder );
5351 return new ChangeMoveSelector <>(entitySelector , valueSelector , randomSelection );
@@ -56,17 +54,17 @@ protected MoveSelector<Solution_> buildBaseMoveSelector(HeuristicConfigPolicy<So
5654 @ Override
5755 protected MoveSelectorConfig <?> buildUnfoldedMoveSelectorConfig (HeuristicConfigPolicy <Solution_ > configPolicy ) {
5856 Collection <EntityDescriptor <Solution_ >> entityDescriptors ;
59- EntityDescriptor < Solution_ > onlyEntityDescriptor = config .getEntitySelectorConfig () == null ? null
57+ var onlyEntityDescriptor = config .getEntitySelectorConfig () == null ? null
6058 : EntitySelectorFactory .<Solution_ > create (config .getEntitySelectorConfig ())
6159 .extractEntityDescriptor (configPolicy );
6260 if (onlyEntityDescriptor != null ) {
6361 entityDescriptors = Collections .singletonList (onlyEntityDescriptor );
6462 } else {
6563 entityDescriptors = configPolicy .getSolutionDescriptor ().getGenuineEntityDescriptors ();
6664 }
67- List < GenuineVariableDescriptor < Solution_ >> variableDescriptorList = new ArrayList <>();
65+ var variableDescriptorList = new ArrayList <GenuineVariableDescriptor < Solution_ > >();
6866 for (EntityDescriptor <Solution_ > entityDescriptor : entityDescriptors ) {
69- GenuineVariableDescriptor < Solution_ > onlyVariableDescriptor = config .getValueSelectorConfig () == null ? null
67+ var onlyVariableDescriptor = config .getValueSelectorConfig () == null ? null
7068 : ValueSelectorFactory .<Solution_ > create (config .getValueSelectorConfig ())
7169 .extractVariableDescriptor (configPolicy , entityDescriptor );
7270 if (onlyVariableDescriptor != null ) {
@@ -82,28 +80,35 @@ protected MoveSelectorConfig<?> buildUnfoldedMoveSelectorConfig(HeuristicConfigP
8280 variableDescriptorList .addAll (entityDescriptor .getGenuineVariableDescriptorList ());
8381 }
8482 }
85- return buildUnfoldedMoveSelectorConfig (variableDescriptorList );
83+ return buildUnfoldedMoveSelectorConfig (configPolicy , variableDescriptorList );
8684 }
8785
88- protected MoveSelectorConfig <?> buildUnfoldedMoveSelectorConfig (
86+ protected MoveSelectorConfig <?> buildUnfoldedMoveSelectorConfig (HeuristicConfigPolicy < Solution_ > configPolicy ,
8987 List <GenuineVariableDescriptor <Solution_ >> variableDescriptorList ) {
90- List < MoveSelectorConfig > moveSelectorConfigList = new ArrayList <>(variableDescriptorList .size ());
91- for (GenuineVariableDescriptor < Solution_ > variableDescriptor : variableDescriptorList ) {
88+ var moveSelectorConfigList = new ArrayList <MoveSelectorConfig >(variableDescriptorList .size ());
89+ for (var variableDescriptor : variableDescriptorList ) {
9290 if (variableDescriptor .isListVariable ()) {
91+ if (configPolicy .getSolutionDescriptor ().hasBothBasicAndListVariables ()) {
92+ // When using a mixed model,
93+ // we do not create a list move
94+ // and delegate it to the ListChangeMoveSelectorFactory.
95+ // The strategy aims to provide a more normalized move selector collection for mixed models.
96+ continue ;
97+ }
9398 // No childMoveSelectorConfig.inherit() because of unfoldedMoveSelectorConfig.inheritFolded()
94- ListChangeMoveSelectorConfig childMoveSelectorConfig =
99+ var childMoveSelectorConfig =
95100 buildListChangeMoveSelectorConfig ((ListVariableDescriptor <?>) variableDescriptor , false );
96101 moveSelectorConfigList .add (childMoveSelectorConfig );
97102 } else {
98103 // No childMoveSelectorConfig.inherit() because of unfoldedMoveSelectorConfig.inheritFolded()
99- ChangeMoveSelectorConfig childMoveSelectorConfig = new ChangeMoveSelectorConfig ();
104+ var childMoveSelectorConfig = new ChangeMoveSelectorConfig ();
100105 // Different EntitySelector per child because it is a union
101- EntitySelectorConfig childEntitySelectorConfig = new EntitySelectorConfig (config .getEntitySelectorConfig ());
106+ var childEntitySelectorConfig = new EntitySelectorConfig (config .getEntitySelectorConfig ());
102107 if (childEntitySelectorConfig .getMimicSelectorRef () == null ) {
103108 childEntitySelectorConfig .setEntityClass (variableDescriptor .getEntityDescriptor ().getEntityClass ());
104109 }
105110 childMoveSelectorConfig .setEntitySelectorConfig (childEntitySelectorConfig );
106- ValueSelectorConfig childValueSelectorConfig = new ValueSelectorConfig (config .getValueSelectorConfig ());
111+ var childValueSelectorConfig = new ValueSelectorConfig (config .getValueSelectorConfig ());
107112 if (childValueSelectorConfig .getMimicSelectorRef () == null ) {
108113 childValueSelectorConfig .setVariableName (variableDescriptor .getVariableName ());
109114 }
@@ -130,8 +135,8 @@ The changeMoveSelectorConfig ({}) is being used for a list variable.
130135 We are keeping this option through the 1.x release stream for backward compatibility reasons.
131136 Please update your solver config to use {} now.""" ,
132137 config , ListChangeMoveSelectorConfig .class .getSimpleName ());
133- ListChangeMoveSelectorConfig listChangeMoveSelectorConfig = ListChangeMoveSelectorFactory .buildChildMoveSelectorConfig (
134- variableDescriptor , config .getValueSelectorConfig (), createDestinationSelectorConfig ());
138+ var listChangeMoveSelectorConfig = ListChangeMoveSelectorFactory .buildChildMoveSelectorConfig (variableDescriptor ,
139+ config .getValueSelectorConfig (), createDestinationSelectorConfig ());
135140 if (inheritFoldedConfig ) {
136141 listChangeMoveSelectorConfig .inheritFolded (config );
137142 }
0 commit comments