org.powertac.customer.CustomerModelService Maven / Gradle / Ivy
/*
* Copyright (c) 2014 by John Collins
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.powertac.customer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.joda.time.Instant;
import org.powertac.common.Competition;
import org.powertac.common.CustomerInfo;
import org.powertac.common.Tariff;
import org.powertac.common.TimeService;
import org.powertac.common.interfaces.BootstrapState;
import org.powertac.common.interfaces.CustomerServiceAccessor;
import org.powertac.common.interfaces.InitializationService;
import org.powertac.common.interfaces.NewTariffListener;
import org.powertac.common.interfaces.ServerConfiguration;
import org.powertac.common.interfaces.TariffMarket;
import org.powertac.common.interfaces.TimeslotPhaseProcessor;
import org.powertac.common.repo.CustomerRepo;
import org.powertac.common.repo.RandomSeedRepo;
import org.powertac.common.repo.TariffRepo;
import org.powertac.common.repo.TariffSubscriptionRepo;
import org.powertac.common.repo.TimeslotRepo;
import org.powertac.common.repo.WeatherReportRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Manages a set of customer models. Each must be configurable as
* ConfigurableInstances. Each gets supplied a set of service interfaces.
* In each timeslot, each model has its step() method called. When tariffs
* are published, each has its evaluateTariffs() method called. At the end
* of a boot session, each has its bootstrap state saved to the boot record.
*
* @author John Collins
*/
@Service
public class CustomerModelService
extends TimeslotPhaseProcessor
implements InitializationService, BootstrapState, NewTariffListener,
CustomerServiceAccessor
{
static private Logger log =
LogManager.getLogger(CustomerModelService.class.getName());
@Autowired
private TimeService timeService;
@Autowired
private TimeslotRepo timeslotRepo;
@Autowired
private CustomerRepo customerRepo;
@Autowired
private ServerConfiguration serverConfig;
@Autowired
private WeatherReportRepo weatherReportRepo;
@Autowired
private RandomSeedRepo randomSeedRepo;
@Autowired
private TariffRepo tariffRepo;
@Autowired
private TariffSubscriptionRepo tariffSubscriptionRepo;
@Autowired
private TariffMarket tariffMarketService;
// Customer model collection
//private ArrayList> modelTypes;
private ArrayList models;
@Override
public String
initialize (Competition competition, List completedInits)
{
if (!completedInits.contains("DefaultBroker")
|| !completedInits.contains("TariffMarket"))
return null;
super.init();
//tariffMarketService.registerNewTariffListener(this);
//modelTypes = new ArrayList>();
models = new ArrayList();
// extract the model types
ServiceLoader loader =
ServiceLoader.load(AbstractCustomer.class);
// Populate and initialize the models.
// Note that the instances loaded by the service loader are discarded --
// the real instances are created by serverConfig.
Iterator modelIterator = loader.iterator();
while (modelIterator.hasNext()) {
AbstractCustomer modelEx = modelIterator.next();
for (Object modelObj:
serverConfig.configureInstances(modelEx.getClass())) {
AbstractCustomer model = (AbstractCustomer) modelObj;
log.info("Adding model " + model.getName());
models.add(model);
model.setServiceAccessor(this);
model.initialize();
// set default tariff here to make models testable outside Spring.
for (CustomerInfo cust: model.getCustomerInfos()) {
tariffMarketService.subscribeToTariff(tariffMarketService
.getDefaultTariff(cust.getPowerType()), cust, cust.getPopulation());
customerRepo.add(cust);
}
}
}
return "Customer";
}
/* (non-Javadoc)
* @see org.powertac.common.interfaces.TimeslotPhaseProcessor#activate(org.joda.time.Instant, int)
*/
@Override
public void activate (Instant time, int phaseNumber)
{
for (AbstractCustomer model : models) {
log.info("Step model " + model.getName());
model.step();
}
}
@Override
public void publishNewTariffs (List tariffs)
{
for (AbstractCustomer model : models) {
log.info("Evaluating tariffs for " + model.getName());
model.evaluateTariffs(tariffs);
}
}
// test support methods
List getModelList ()
{
return models;
}
@Override
public void saveBootstrapState ()
{
serverConfig.saveBootstrapState(models);
for (AbstractCustomer model : models) {
// some models have to save local state
model.saveBootstrapState();
}
}
// ==============================
// CustomerServiceAccessor API
// ==============================
@Override
public CustomerRepo getCustomerRepo ()
{
return customerRepo;
}
@Override
public RandomSeedRepo getRandomSeedRepo ()
{
return randomSeedRepo;
}
@Override
public TariffRepo getTariffRepo ()
{
return tariffRepo;
}
@Override
public TariffSubscriptionRepo getTariffSubscriptionRepo ()
{
return tariffSubscriptionRepo;
}
@Override
public TimeslotRepo getTimeslotRepo ()
{
return timeslotRepo;
}
@Override
public TimeService getTimeService()
{
return timeService;
}
@Override
public WeatherReportRepo getWeatherReportRepo ()
{
return weatherReportRepo;
}
@Override
public ServerConfiguration getServerConfiguration ()
{
return serverConfig;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy