@Override public double getEnergyDemand( final double maxRequired ) { final Queue<IEnergyGridProvider> toVisit = new PriorityQueue<>( COMPARATOR_LOWEST_PERCENTAGE_FIRST ); final Set<IEnergyGridProvider> visited = new HashSet<>(); toVisit.add( this ); double required = 0; while( !toVisit.isEmpty() && required < maxRequired ) { final IEnergyGridProvider next = toVisit.poll(); visited.add( next ); required += next.getProviderEnergyDemand( maxRequired - required ); for( IEnergyGridProvider iEnergyGridProvider : next.providers() ) { if( !visited.contains( iEnergyGridProvider ) ) { toVisit.add( iEnergyGridProvider ); } } } return required; }
@Override public double injectPower( final double amt, final Actionable mode ) { final Queue<IEnergyGridProvider> toVisit = new PriorityQueue<>( COMPARATOR_LOWEST_PERCENTAGE_FIRST ); final Set<IEnergyGridProvider> visited = new HashSet<>(); toVisit.add( this ); double leftover = amt; while( !toVisit.isEmpty() && leftover > 0 ) { final IEnergyGridProvider next = toVisit.poll(); visited.add( next ); leftover = next.injectProviderPower( leftover, mode ); for( IEnergyGridProvider iEnergyGridProvider : next.providers() ) { if( !visited.contains( iEnergyGridProvider ) ) { toVisit.add( iEnergyGridProvider ); } } } return leftover; }
@Override public double extractAEPower( final double amt, final Actionable mode, final PowerMultiplier pm ) { final double toExtract = pm.multiply( amt ); final Queue<IEnergyGridProvider> toVisit = new PriorityQueue<>( COMPARATOR_HIGHEST_AMOUNT_STORED_FIRST ); final Set<IEnergyGridProvider> visited = new HashSet<>(); double extracted = 0; toVisit.add( this ); while( !toVisit.isEmpty() && extracted < toExtract ) { final IEnergyGridProvider next = toVisit.poll(); visited.add( next ); extracted += next.extractProviderPower( toExtract - extracted, mode ); for( IEnergyGridProvider iEnergyGridProvider : next.providers() ) { if( !visited.contains( iEnergyGridProvider ) ) { toVisit.add( iEnergyGridProvider ); } } } return pm.divide( extracted ); }