16 package emlab.gen.role.market;
18 import java.util.ArrayList;
19 import java.util.HashMap;
20 import java.util.List;
24 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.transaction.annotation.Transactional;
27 import agentspring.role.Role;
28 import agentspring.role.RoleComponent;
41 import emlab.gen.role.AbstractEnergyProducerRole;
51 Role<EnergyProducer> {
59 createOffersForElectricitySpotMarket(producer, getCurrentTick(),
false, null);
63 public List<PowerPlantDispatchPlan> createOffersForElectricitySpotMarket(
EnergyProducer producer,
long tick,
64 boolean forecast, Map<Substance, Double> forecastedFuelPrices) {
65 List<PowerPlantDispatchPlan> ppdpList =
new ArrayList<PowerPlantDispatchPlan>();
67 if (forecastedFuelPrices == null && !forecast) {
69 forecastedFuelPrices =
new HashMap<Substance, Double>();
70 for (
Substance substance : reps.substanceRepository.findAllSubstancesTradedOnCommodityMarkets()) {
71 forecastedFuelPrices.put(substance, findLastKnownPriceForSubstance(substance, getCurrentTick()));
76 long numberOfSegments = reps.segmentRepository.count();
79 market = producer.getInvestorMarket();
81 Iterable<PowerPlant> powerPlants;
82 if (producer != null) {
83 powerPlants = forecast ? reps.powerPlantRepository
84 .findExpectedOperationalPowerPlantsInMarketByOwner(market, tick, producer) : reps.powerPlantRepository
87 powerPlants = forecast ? reps.powerPlantRepository.findExpectedOperationalPowerPlants(tick)
91 boolean producerIsNull = (producer == null) ?
true :
false;
96 market = reps.marketRepository.findElectricitySpotMarketForZone(plant.getLocation().getZone());
97 producer = plant.getOwner();
103 mc = calculateMarginalCostExclCO2MarketCost(plant, tick);
104 price = mc * producer.getPriceMarkUp();
106 mc = calculateExpectedMarginalCostExclCO2MarketCost(plant, forecastedFuelPrices, tick);
107 price = mc * producer.getPriceMarkUp();
110 logger.info(
"Submitting offers for {} with technology {}", plant.getName(), plant.getTechnology().getName());
112 for (
SegmentLoad segmentload : market.getLoadDurationCurve()) {
113 Segment segment = segmentload.getSegment();
115 if (tick == getCurrentTick()) {
116 capacity = plant.getAvailableCapacity(tick, segment, numberOfSegments);
118 capacity = plant.getExpectedAvailableCapacity(tick, segment, numberOfSegments);
121 logger.info(
"I bid capacity: {} and price: {}", capacity, mc);
124 .findOnePowerPlantDispatchPlanForPowerPlantForSegmentForTime(plant, segment, tick, forecast);
141 plan.specifyNotPersist(plant, producer, market, segment, tick, price, price, capacity, 0,
142 Bid.SUBMITTED, forecast);
145 plan.setBidder(producer);
146 plan.setBiddingMarket(market);
148 plan.setBidWithoutCO2(mc);
149 plan.setAmount(capacity);
150 plan.setAcceptedAmount(0d);
151 plan.setCapacityLongTermContract(0d);
152 plan.setStatus(Bid.SUBMITTED);
153 plan.setForecast(forecast);
165 void updateMarginalCostInclCO2AfterFuelMixChange(
double co2Price,
166 Map<ElectricitySpotMarket, Double> nationalMinCo2Prices,
long clearingTick,
boolean forecast,
167 Map<Substance, Double> fuelPriceMap) {
172 Government government = reps.template.findAll(Government.class).iterator().next();
174 .findAllPowerPlantDispatchPlansForTime(
175 clearingTick, forecast)) {
178 double effectiveCO2Price;
180 double capacity = plan.getAmount();
181 if (nationalMinCo2Prices.get(plan.getBiddingMarket()) > co2Price)
182 effectiveCO2Price = nationalMinCo2Prices.get(plan.getBiddingMarket());
184 effectiveCO2Price = co2Price;
186 if (plan.getPowerPlant().getFuelMix().size() > 1) {
188 double oldmc = plan.getBidWithoutCO2();
191 Set<Substance> possibleFuels = plan.getPowerPlant().getTechnology().getFuels();
192 Map<Substance, Double> substancePriceMap =
new HashMap<Substance, Double>();
194 for (
Substance substance : possibleFuels) {
195 substancePriceMap.put(substance, fuelPriceMap.get(substance));
197 Set<SubstanceShareInFuelMix> fuelMix = calculateFuelMix(plan.getPowerPlant(), substancePriceMap,
198 government.getCO2Tax(clearingTick) + effectiveCO2Price);
199 plan.getPowerPlant().setFuelMix(fuelMix);
200 double mc = calculateMarginalCostExclCO2MarketCost(plan.getPowerPlant(), clearingTick);
202 plan.setBidWithoutCO2(mc);
208 plan.setPrice(plan.getBidWithoutCO2()
209 + (effectiveCO2Price * plan.getPowerPlant().calculateEmissionIntensity()));
211 plan.setStatus(Bid.SUBMITTED);
212 plan.setAmount(capacity);
213 plan.setAcceptedAmount(0d);
214 plan.setCapacityLongTermContract(0d);
Iterable< PowerPlant > findOperationalPowerPlants(@Param("tick") long tick)
Iterable< PowerPlant > findOperationalPowerPlantsByOwner(@Param("owner") EnergyProducer owner,@Param("tick") long tick)