|
@@ -22,13 +22,24 @@ public class FlexManager {
|
|
|
private int timeStep;
|
|
|
private List<Flexibility> allFlexModels;
|
|
|
private List<Flexibility> allFlexesOrderedThisTimeStep = new ArrayList<Flexibility>();
|
|
|
+ private HashMap<HolonElement, List<FlexWrapper>> accessOtherFlex = new HashMap<HolonElement, List<FlexWrapper>>();
|
|
|
private HashMap<Flexibility, FlexWrapper> accessFlexMap = new HashMap<Flexibility, FlexWrapper>();
|
|
|
public FlexManager(Model model, int timeStep, FlexManager timestepBefore){
|
|
|
|
|
|
this.timeStep = timeStep;
|
|
|
allFlexModels = getAllFlexFromModel(model);
|
|
|
|
|
|
- allFlexModels.stream().map(flex -> new FlexWrapper(flex, timeStep, (timestepBefore != null)?timestepBefore.getFlexWrapper(flex):null)).forEach(flexWrapper -> accessFlexMap.put(flexWrapper.getFlex(), flexWrapper));
|
|
|
+ allFlexModels.stream().map(flex -> new FlexWrapper(flex, timeStep, (timestepBefore != null)?timestepBefore.getFlexWrapper(flex):null)).forEach(flexWrapper -> {
|
|
|
+ accessFlexMap.put(flexWrapper.getFlex(), flexWrapper);
|
|
|
+ HolonElement ele = flexWrapper.getFlex().getElement();
|
|
|
+ if(accessOtherFlex.containsKey(ele)) {
|
|
|
+ accessOtherFlex.get(ele).add(flexWrapper);
|
|
|
+ }else {
|
|
|
+ ArrayList<FlexWrapper> toAdd = new ArrayList<FlexWrapper>();
|
|
|
+ toAdd.add(flexWrapper);
|
|
|
+ accessOtherFlex.put(ele, new ArrayList<FlexWrapper>(toAdd));
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
accessFlexMap.values().stream().forEach(flexWrapper -> flexWrapper.revalidateState());
|
|
|
}
|
|
@@ -132,7 +143,7 @@ public class FlexManager {
|
|
|
!otherFlexInUseOrOnCooldown();
|
|
|
}
|
|
|
private boolean otherFlexInUseOrOnCooldown() {
|
|
|
- return accessFlexMap.values().stream().anyMatch(flexWrapper -> (flexWrapper.getFlex().getElement() == flex.getElement() && flexWrapper != this && (flexWrapper.getState() == FlexState.IN_USE || flexWrapper.getState() == FlexState.ON_COOLDOWN)));
|
|
|
+ return accessOtherFlex.get(this.getFlex().getElement()).stream().anyMatch(flexWrapper -> flexWrapper != this && (flexWrapper.getState() == FlexState.IN_USE || flexWrapper.getState() == FlexState.ON_COOLDOWN));
|
|
|
}
|
|
|
public boolean order() {
|
|
|
if(canOrder()) {
|
|
@@ -140,7 +151,8 @@ public class FlexManager {
|
|
|
allFlexesOrderedThisTimeStep.add(flex);
|
|
|
durationEndTime = timeStep + flex.getDuration();
|
|
|
coolDownEndTime = durationEndTime + flex.getCooldown();
|
|
|
- accessFlexMap.values().stream().filter(flexWrapper -> (flexWrapper.getFlex().getElement() == flex.getElement() && flexWrapper != this)).forEach(otherFlex -> otherFlex.revalidateState());
|
|
|
+
|
|
|
+ accessOtherFlex.get(this.getFlex().getElement()).stream().filter(flexWrapper -> (flexWrapper != this)).forEach(otherFlex -> otherFlex.revalidateState());
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
@@ -151,8 +163,8 @@ public class FlexManager {
|
|
|
durationEndTime = -1;
|
|
|
coolDownEndTime = -1;
|
|
|
allFlexesOrderedThisTimeStep.remove(flex);
|
|
|
- accessFlexMap.values().stream().filter(flexWrapper -> (flexWrapper.getFlex().getElement() == flex.getElement() && flexWrapper != this)).forEach(otherFlex -> otherFlex.revalidateState());
|
|
|
-
|
|
|
+ accessOtherFlex.get(this.getFlex().getElement()).stream().filter(flexWrapper -> (flexWrapper != this)).forEach(otherFlex -> otherFlex.revalidateState());
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|