Browse Source

Performance upgrade for flexibilities

Tom Troppmann 4 years ago
parent
commit
ffeadaf0b8
2 changed files with 19 additions and 5 deletions
  1. 2 0
      src/api/AlgorithmFrameworkFlex.java
  2. 17 5
      src/ui/controller/FlexManager.java

+ 2 - 0
src/api/AlgorithmFrameworkFlex.java

@@ -540,7 +540,9 @@ public abstract class AlgorithmFrameworkFlex implements AddOn{
 
 	private void executeAlgoWithParameter(){
 		double startFitness = evaluatePosition(extractPositionAndAccess());
+		console.println("BitLength: " + access.size());
 		resetChain.removeLast();
+		
 		runPrinter.println(algoInformationToPrint());
 		runProgressbar.start();
 		Individual runBest = new Individual();

+ 17 - 5
src/ui/controller/FlexManager.java

@@ -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){
 		//Thread.dumpStack();
 		this.timeStep = timeStep;
 		allFlexModels = getAllFlexFromModel(model);
 		//fill accessFlexMap
-		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));
+			}
+			});
 		//because when added not all flexes can see others
 		accessFlexMap.values().stream().forEach(flexWrapper -> flexWrapper.revalidateState());
 	}
@@ -132,7 +143,7 @@ public class FlexManager {
 					!otherFlexInUseOrOnCooldown(); //No other flex of this ele in use
 		}
 		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());
+				//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;