Browse Source

Merge branch 'updateInProgress' of https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons.git into updateInProgress2

Rolf Egert 5 years ago
parent
commit
dbb033fe18

+ 59 - 18
src/exampleAlgorithms/FlexExample.java

@@ -9,6 +9,7 @@ import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -59,6 +60,7 @@ public class FlexExample implements Algorithm {
 
 		//Parameter defined by Algo
 		private HashMap<Integer, AccessWrapper> access;
+		LinkedList<List<Boolean>> resetChain = new LinkedList<List<Boolean>>();
 		private List<Boolean> initialState;
 		private List<HolonSwitch> switchList;
 		private List<HolonObject> objectList;
@@ -159,16 +161,20 @@ public class FlexExample implements Algorithm {
 		}
 		public JPanel createButtonPanel() {
 			JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+			JButton resetButton =  new JButton("ResetAll");
+			resetButton.setToolTipText("Resets the State to before the Algorithm has runed.");
+			resetButton.addActionListener(actionEvent -> resetAll());
+			buttonPanel.add(resetButton);
 			JButton cancelButton =  new JButton("Cancel Run");
 			cancelButton.addActionListener(actionEvent -> cancel());
 			buttonPanel.add(cancelButton);
 			JButton clearButton =  new JButton("Clear Console");
 			clearButton.addActionListener(actionEvent -> clear());
 			buttonPanel.add(clearButton);
-			JButton resetButton =  new JButton("Reset");
-			resetButton.setToolTipText("Resets the State to before the Algorithm has runed.");
-			resetButton.addActionListener(actionEvent -> reset());
-			buttonPanel.add(resetButton);
+			JButton undoButton =  new JButton("Undo");
+			undoButton.setToolTipText("One Algo Step Back.");
+			undoButton.addActionListener(actionEvent -> resetLast());
+			buttonPanel.add(undoButton);
 			JButton runButton =  new JButton("Run");
 			runButton.addActionListener(actionEvent -> {
 				Runnable task = () -> run();
@@ -195,7 +201,7 @@ public class FlexExample implements Algorithm {
 			startTimer();
 			executeDemoAlgo();
 			if(cancel) {
-				reset();
+				resetLast();
 				disableGuiInput(false);
 				return;
 			}
@@ -203,11 +209,25 @@ public class FlexExample implements Algorithm {
 			disableGuiInput(false);
 		}
 		
-		private void reset() {
-			if(initialState != null) {
+		private void resetLast() {
+			if(!resetChain.isEmpty()) {
 				println("Resetting..");
 				resetState();
+				resetChain.removeLast();
+				control.resetSimulation();
+				updateVisual();
+			}else {
+				println("No run inistialized.");
+			}
+		}
+		
+		private void resetAll() {
+			if(!resetChain.isEmpty()) {
+				println("Resetting..");
+				setState(resetChain.getFirst());
+				resetChain.clear();
 				control.resetSimulation();
+				control.setCurIteration(0);
 				updateVisual();
 			}else {
 				println("No run inistialized.");
@@ -215,6 +235,7 @@ public class FlexExample implements Algorithm {
 		}
 		
 		
+		
 		private void disableGuiInput(boolean bool) {
 			control.guiDiable(bool);
 		}
@@ -311,24 +332,39 @@ public class FlexExample implements Algorithm {
 				println("production: " + production);
 				println("consumption: " + consumption);
 				println("difference: " + difference);
+				if(difference == 0)continue;
 				Set<HolonElement> allHolonElemntsInThisNetwork = createListOfAllHolonElemnts(net);
 				FlexManager flexManager = control.getSimManager().getActualFlexManager();
 				
 				List<FlexWrapper> allOfferedFlex = flexManager.getAllFlexWrapperWithState(FlexState.OFFERED).stream().filter(flexWrapper -> allHolonElemntsInThisNetwork.contains(flexWrapper.getFlex().getElement())).collect(Collectors.toList());
 				List<FlexWrapper> allFlexThatGetMeEnergy = allOfferedFlex.stream().filter(flexWrapper -> (flexWrapper.getFlex().bringtmir() > 0)).collect(Collectors.toList());
 				float amountOfAllEnergyOffered = sumEnergyAvailable(allFlexThatGetMeEnergy);
-				println("amountOfAllEnergyOffered:" + amountOfAllEnergyOffered);
-				println("vor continue");
+				println("amountOfAllFlexEnergyOffered:" + amountOfAllEnergyOffered);
 				if(production > consumption) continue;
-				println("nach continue");
-				if(priorityListASC != null) println("sdfsdf");
-				priorityListASC.stream().forEach(prio -> println("Prio"));
+				//ShuddownPriorities
 				for(Priority emergencyShutDownPriority: priorityListASC) {
-					println("Wir sind hier: " + emergencyShutDownPriority);
 					if(amountOfAllEnergyOffered >= difference) break; 
 					println("ShutDown: " + emergencyShutDownPriority);
 					difference -= shutDownAllConsumerElementsWithPriority(flexManager, allHolonElemntsInThisNetwork, emergencyShutDownPriority);
 				}
+				
+				//SortFlexes
+				allFlexThatGetMeEnergy.sort((flex1, flex2) -> Float.compare(flex1.getFlex().cost / flex1.getFlex().bringtmir(), flex2.getFlex().cost / flex2.getFlex().bringtmir()));
+				//OrderFlexes
+				float costForThisTimeStep = 0f;
+				for(FlexWrapper flexWrapper : allFlexThatGetMeEnergy) {
+					if(!flexWrapper.canOrder()) continue;
+					float energy = flexWrapper.getFlex().bringtmir();
+					if(energy <= difference) {
+						println("energyGained:" + energy);
+						difference -= energy;
+						costForThisTimeStep += flexWrapper.getFlex().cost;
+						flexWrapper.order();
+						continue;
+					}
+				}
+				println("CostForThisTimeStep:" + costForThisTimeStep);
+				
 				println("Ende");
 			
 				
@@ -343,7 +379,8 @@ public class FlexExample implements Algorithm {
 					//.forEach(hElement -> hElement.setActive(false));
 			float energyGained = elementsOfPriorityToShutdown.stream().map(hElement -> -hElement.getEnergyPerElement() * hElement.getAmount()).reduce(0.0f, (a, b) -> a + b);
 			elementsOfPriorityToShutdown.forEach(hElement -> hElement.setActive(false));
-			println("Gained " + energyGained + "Energy from Shutdown with Priority:" + emergencyShutDownPriority);
+			int shutdownCount = elementsOfPriorityToShutdown.size();
+			println("Gained " + energyGained + "Energy from Shutdown with Priority:" + emergencyShutDownPriority + " AmountOfShutDowned HolonElements: " + shutdownCount);
 			return energyGained;
 		}
 		private Set<HolonElement> createListOfAllHolonElemnts(DecoratedNetwork net) {
@@ -356,7 +393,10 @@ public class FlexExample implements Algorithm {
 
 	
 		private float sumEnergyAvailable(List<FlexWrapper> flexList) {
-			return flexList.stream().map(flexWrapper -> flexWrapper.getFlex().bringtmir()).reduce(0.0f,(a, b) -> a + b);
+			HashMap<HolonElement, FlexWrapper> dublicateFilter = new HashMap<HolonElement, FlexWrapper>();
+			flexList.stream().forEach(flexWrapper -> dublicateFilter.put(flexWrapper.getFlex().getElement(), flexWrapper));
+			
+			return dublicateFilter.values().stream().map(flexWrapper -> flexWrapper.getFlex().bringtmir()).reduce(0.0f,(a, b) -> a + b);
 		}
 		private List<Priority> createPriorityListASC() {
 			List<Priority> priorityASC = new ArrayList<Priority>();
@@ -376,9 +416,10 @@ public class FlexExample implements Algorithm {
 			Model model = control.getModel();
 			switchList = new ArrayList<HolonSwitch>();
 			objectList = new ArrayList<HolonObject>();
-			initialState = new ArrayList<Boolean>(); 
+			initialState = new ArrayList<Boolean>();
 			access= new HashMap<Integer, AccessWrapper>();
-			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getNodes() :model.getObjectsOnCanvas(), initialState, model.getCurIteration());
+			rollOutNodes((useGroupNode && (dGroupNode != null))? dGroupNode.getModel().getNodes() :model.getObjectsOnCanvas(), initialState, model.getCurIteration());			
+			resetChain.add(initialState); 
 			return initialState;
 		}
 		/**
@@ -419,7 +460,7 @@ public class FlexExample implements Algorithm {
 		 * Sets the Model back to its original State before the LAST run.
 		 */
 		private void resetState() {
-			setState(initialState);
+			setState(resetChain.getLast());
 		}
 		
 		/**

+ 1 - 0
src/ui/controller/Control.java

@@ -486,6 +486,7 @@ public class Control {
      */
     public void setCurIteration(int curit) {
         globalController.setCurIteration(curit);
+        getGui().getTimePanel().getTimeSlider().setValue(curit);
     }
 
     /**

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

@@ -28,6 +28,8 @@ public class FlexManager {
 		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));
+		//because when added not all flexes can see others
+		accessFlexMap.values().stream().forEach(flexWrapper -> flexWrapper.revalidateState());
 	}
 
 	
@@ -101,13 +103,20 @@ public class FlexManager {
 			}else {
 				durationEndTime = old.durationEndTime;
 				coolDownEndTime = old.coolDownEndTime;
-				if(remainingTimeTillActivation() == 0) state = flex.fulfillsConstrains()?(flex.offered?FlexState.OFFERED:FlexState.NOT_OFFERED):FlexState.UNAVAILABLE;
-				else if(remainingDuration()== 0) state = FlexState.ON_COOLDOWN;
-				else state = FlexState.IN_USE;
+				revalidateState();
 			}
 				
 			
 		}
+		
+		public void revalidateState() {
+			if(remainingTimeTillActivation() == 0) state = (flex.fulfillsConstrains() && !otherFlexInUseOrOnCooldown())?(flex.offered?FlexState.OFFERED:FlexState.NOT_OFFERED):FlexState.UNAVAILABLE;
+			else if(remainingDuration()== 0) state = FlexState.ON_COOLDOWN;
+			else state = FlexState.IN_USE;
+		}
+		
+		
+		
 		public Flexibility getFlex() {
 			return flex;
 		}
@@ -116,14 +125,18 @@ public class FlexManager {
 		}
 		public boolean canOrder() {
 			return (state == FlexState.OFFERED) &&  //Right state
-					!accessFlexMap.values().stream().anyMatch(flexWrapper -> (flexWrapper.getFlex().getElement() == flex.getElement() && flexWrapper != this && (flexWrapper.getState() == FlexState.IN_USE || flexWrapper.getState() == FlexState.ON_COOLDOWN))); //No other flex of this ele in use
+					!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)));
 		}
 		public boolean order() {
 			if(canOrder()) {
 				state=FlexState.IN_USE;
 				allFlexesOrderedThisTimeStep.add(flex);
 				durationEndTime = timeStep + flex.getDuration();
-				coolDownEndTime = durationEndTime + flex.getCooldown(); 
+				coolDownEndTime = durationEndTime + flex.getCooldown();
+				accessFlexMap.values().stream().filter(flexWrapper -> (flexWrapper.getFlex().getElement() == flex.getElement() && flexWrapper != this)).forEach(otherFlex -> otherFlex.revalidateState());
 				return true;
 			}
 			return false;

+ 0 - 2
src/ui/view/DisplayedInformationPopUp.java

@@ -90,8 +90,6 @@ public class DisplayedInformationPopUp extends JDialog {
 	 * @param nodeOfnode 
 	 */
 	private void setInformation(boolean connection, boolean object, boolean borders, boolean nodeOfnode) {
-		System.out.println("Test " + connection);
-		
 		canvas.setShowedInformation(connection, object, borders, nodeOfnode);
 		canvas.repaint();
 		toUpdate.updateUI();

+ 2 - 2
src/ui/view/FlexWindow.java

@@ -332,7 +332,7 @@ public class FlexWindow extends JFrame {
 		listOfAllSelectedHolonObjects.removeAllChildren();
 		//Init with HolonObjects
 		for(AbstractCpsObject aCps: model.getSelectedCpsObjects()) {
-			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName());
+			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
 			if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
 			if(aCps instanceof CpsUpperNode)expandTreeUpperNode((CpsUpperNode)aCps, newObjectChild);
 			listOfAllSelectedHolonObjects.add(newObjectChild);
@@ -369,7 +369,7 @@ public class FlexWindow extends JFrame {
 
 	private void expandTreeUpperNode(CpsUpperNode groupNode, DefaultMutableTreeNode root) {
 		for(AbstractCpsObject aCps: groupNode.getNodes()) {
-			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName());
+			DefaultMutableTreeNode newObjectChild = new DefaultMutableTreeNode(aCps.getName() + " ID:" + aCps.getId());
 			if(aCps instanceof HolonObject) expandTreeHolonObject((HolonObject)aCps, newObjectChild);
 			if(aCps instanceof CpsUpperNode)expandTreeUpperNode((CpsUpperNode)aCps, newObjectChild);
 			root.add(newObjectChild);

+ 4 - 0
src/ui/view/GUI.java

@@ -285,6 +285,10 @@ public class GUI implements CategoryListener {
 	private int yValueElements = 0;
 	// Time Stuff
 	private TimePanel timePanel;
+	public TimePanel getTimePanel() {
+		return timePanel;
+	}
+
 	// Coord for all Cells with text
 	private int yThis;
 	private int xThis;