Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package tau.tac.adx.agents;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.LinkedList;
- import java.util.Map;
- import java.util.Queue;
- import java.util.Set;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import edu.umich.eecs.tac.props.Ad;
- import edu.umich.eecs.tac.props.BankStatus;
- import se.sics.isl.transport.Transportable;
- import se.sics.tasim.aw.Agent;
- import se.sics.tasim.aw.Message;
- import se.sics.tasim.props.SimulationStatus;
- import se.sics.tasim.props.StartInfo;
- import tau.tac.adx.agents.CampaignData;
- import tau.tac.adx.ads.properties.AdType;
- import tau.tac.adx.demand.CampaignStats;
- import tau.tac.adx.devices.Device;
- import tau.tac.adx.props.AdxBidBundle;
- import tau.tac.adx.props.AdxQuery;
- import tau.tac.adx.props.PublisherCatalog;
- import tau.tac.adx.props.PublisherCatalogEntry;
- import tau.tac.adx.props.ReservePriceInfo;
- import tau.tac.adx.report.adn.AdNetworkReport;
- import tau.tac.adx.report.adn.MarketSegment;
- import tau.tac.adx.report.demand.AdNetBidMessage;
- import tau.tac.adx.report.demand.AdNetworkDailyNotification;
- import tau.tac.adx.report.demand.CampaignOpportunityMessage;
- import tau.tac.adx.report.demand.CampaignReport;
- import tau.tac.adx.report.demand.CampaignReportKey;
- import tau.tac.adx.report.demand.InitialCampaignMessage;
- import tau.tac.adx.report.demand.campaign.auction.CampaignAuctionReport;
- import tau.tac.adx.report.publisher.AdxPublisherReport;
- import tau.tac.adx.report.publisher.AdxPublisherReportEntry;
- public class EmptyAgent extends Agent {
- private final Logger log = Logger.getLogger(EmptyAgent.class.getName());
- @SuppressWarnings("unused")
- private StartInfo startInfo;
- //keep all the {@link CampaignReport campaign reports} delivered to the agent.
- private final Queue<CampaignReport> campaignReports;
- private PublisherCatalog publisherCatalog;
- private InitialCampaignMessage initialCampaignMessage;
- private AdNetworkDailyNotification adNetworkDailyNotification;
- //The addresses of server entities to which the agent should send the daily bids data
- private String demandAgentAddress;
- private String adxAgentAddress;
- //Information regarding the latest campaign opportunity announced
- private CampaignData pendingCampaign;
- //We maintain a List (mapped by the campaign id) of the campaigns won by our agent.;
- private Map<Integer, CampaignData> myCampaigns;
- //the bidBundle to be sent daily to the AdX
- private AdxBidBundle bidBundle;
- // bid level for the user classification service
- private double ucs=0;
- // Current day of simulation
- private int day;
- private String[] publisherNames;
- private Long cmpBidMillis;
- private double qualityScore;
- public EmptyAgent() {
- campaignReports = new LinkedList<CampaignReport>();
- myCampaigns = new HashMap<Integer, CampaignData>();
- bidBundle = new AdxBidBundle();
- demandAgentAddress = null;
- adxAgentAddress = null;
- CampaignData campaignData = new CampaignData(initialCampaignMessage);
- System.out.println("initialCampaign budget " + initialCampaignMessage.getBudgetMillis() / 1000.0);
- campaignData.setBudget(initialCampaignMessage.getBudgetMillis() / 1000.0);
- genCampaignQueries(campaignData);
- /*
- * The initial campaign is already allocated to our agent so we add it
- * to our allocated-campaigns list.
- */
- System.out.println("Day " + day + ": Allocated campaign - " + campaignData);
- myCampaigns.put(initialCampaignMessage.getId(), campaignData);
- }
- private void genCampaignQueries(CampaignData campaignData) {
- Set<AdxQuery> campaignQueriesSet = new HashSet<AdxQuery>();
- for (String PublisherName : publisherNames) {
- campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.mobile, AdType.text));
- campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.mobile, AdType.video));
- campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.pc, AdType.text));
- campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.pc, AdType.video));
- }
- }
- @Override
- protected void messageReceived(Message message) {
- try {
- Transportable content = message.getContent();
- if (content instanceof InitialCampaignMessage) {
- handleInitialCampaignMessage((InitialCampaignMessage) content);
- } else if (content instanceof CampaignOpportunityMessage) {
- handleICampaignOpportunityMessage((CampaignOpportunityMessage) content);
- } else if (content instanceof CampaignReport) {
- handleCampaignReport((CampaignReport) content);
- } else if (content instanceof AdNetworkDailyNotification) {
- handleAdNetworkDailyNotification((AdNetworkDailyNotification) content);
- } else if (content instanceof AdxPublisherReport) {
- handleAdxPublisherReport((AdxPublisherReport) content);
- } else if (content instanceof SimulationStatus) {
- handleSimulationStatus((SimulationStatus) content);
- } else if (content instanceof PublisherCatalog) {
- handlePublisherCatalog((PublisherCatalog) content);
- } else if (content instanceof AdNetworkReport) {
- handleAdNetworkReport((AdNetworkReport) content);
- } else if (content instanceof StartInfo) {
- handleStartInfo((StartInfo) content);
- } else if (content instanceof BankStatus) {
- handleBankStatus((BankStatus) content);
- } else if (content instanceof CampaignAuctionReport) {
- hadnleCampaignAuctionReport((CampaignAuctionReport) content);
- } else if (content instanceof ReservePriceInfo) {
- // ((ReservePriceInfo)content).getReservePriceType();
- } else {
- System.out.println("UNKNOWN Message Received: " + content);
- }
- } catch (NullPointerException e) {
- this.log.log(Level.SEVERE,
- "Exception thrown while trying to parse message." + e);
- return;
- }
- }
- private void hadnleCampaignAuctionReport(CampaignAuctionReport content) {
- }
- private void handleBankStatus(BankStatus content) {
- System.out.println("Day " + day + " :" + content.toString());
- }
- private void handleStartInfo(StartInfo content) {
- this.startInfo = content;
- }
- private void handleAdNetworkReport(AdNetworkReport content) {
- System.out.println("Day " + day + " : AdNetworkReport");
- }
- private void handlePublisherCatalog(PublisherCatalog content) {
- this.publisherCatalog = content;
- getPublishersNames();
- }
- private void getPublishersNames() {
- if (null == publisherNames && publisherCatalog != null) {
- ArrayList<String> names = new ArrayList<String>();
- for (PublisherCatalogEntry pce : publisherCatalog) {
- names.add(pce.getPublisherName());
- }
- publisherNames = new String[names.size()];
- names.toArray(publisherNames);
- }
- }
- private void handleSimulationStatus(SimulationStatus content) {
- System.out.println("Day " + day + " : Simulation Status Received");
- //Send the daily bid for impressions
- sendBidAndAds();
- System.out.println("Day " + day + " ended. Starting next day");
- ++day;
- log.log( Level.FINE, "Processing to day {0} entries in loop",day );
- }
- private void sendBidAndAds() {
- //Your code Here
- bidBundle = new AdxBidBundle();
- int dayBiddingFor = day + 1;
- //The bid you want for the impression should be changed
- double rbid = 0;
- for (CampaignData campaign : myCampaigns.values()) {
- for (AdxQuery query : campaign.campaignQueries) {
- /*
- * among matching entries with the same campaign id, the AdX
- * randomly chooses an entry according to the designated
- * weight. by setting a constant weight 1, we create a
- * uniform probability over active campaigns
- */
- //Set the bid for the query
- rbid = 0;
- bidBundle.addQuery(query, rbid, new Ad(null),campaign.id, 1);
- }
- // Setting the limits
- double impressionLimit = campaign.impsTogo();
- double budgetLimit = campaign.budget;
- bidBundle.setCampaignDailyLimit(campaign.id,(int) impressionLimit, budgetLimit);
- System.out.println("Day " + day+ ": Updated Bid Bundle entries " + "for Campaign id "+ campaign.id);
- }
- if (bidBundle != null) {
- System.out.println("Day " + day + ": Sending BidBundle");
- if (adxAgentAddress != null)
- sendMessage(adxAgentAddress, bidBundle);
- }
- }
- private void handleAdxPublisherReport(AdxPublisherReport adxPublisherReport) {
- System.out.println("Publishers Report: ");
- for (PublisherCatalogEntry publisherKey : adxPublisherReport.keys()) {
- AdxPublisherReportEntry entry = adxPublisherReport.getEntry(publisherKey);
- System.out.println(entry.toString());
- }
- //You code Here
- //Optional if you want to use the attribute of the report - i didn't use
- }
- private void handleAdNetworkDailyNotification(AdNetworkDailyNotification notificationMessage) {
- // TODO Auto-generated method stub
- adNetworkDailyNotification = notificationMessage;
- System.out.println("Day " + day + ": Daily notification for campaign "
- + adNetworkDailyNotification.getCampaignId());
- String campaignAllocatedTo = "CAMPAGIN Allocated to "+ notificationMessage.getWinner();
- //Won
- if ((pendingCampaign != null)&& (pendingCampaign.id == adNetworkDailyNotification.getCampaignId())
- && (notificationMessage.getCostMillis() != 0)) {
- pendingCampaign.setBudget(notificationMessage.getCostMillis() / 1000.0);
- //You Code Here
- //Optional if you want to save any data on the won campagin
- genCampaignQueries(pendingCampaign);
- myCampaigns.put(pendingCampaign.id, pendingCampaign);
- campaignAllocatedTo = " CAMPAGIN WON at cost (Millis)"+ notificationMessage.getCostMillis();
- }
- qualityScore = notificationMessage.getQualityScore();
- System.out
- .println("Day " + day + ": " + campaignAllocatedTo
- + ". UCS Level set to "
- + notificationMessage.getServiceLevel() + " at price "
- + notificationMessage.getPrice()
- + " Quality Score is: "
- + notificationMessage.getQualityScore());
- }
- private void handleCampaignReport(CampaignReport content) {
- campaignReports.add(content);
- for (CampaignReportKey campaignKey : content.keys()) {
- int cmpId = campaignKey.getCampaignId();
- CampaignStats cstats = content.getCampaignReportEntry(
- campaignKey).getCampaignStats();
- myCampaigns.get(cmpId).setStats(cstats);
- System.out.println("Day " + day + ": Updating campaign " + cmpId
- + " stats: " + cstats.getTargetedImps() + " tgtImps "
- + cstats.getOtherImps() + " nonTgtImps. Cost of imps is "
- + cstats.getCost());
- }
- //Your Code Here
- //Optional if you want to use report details to change the bid
- }
- private void handleICampaignOpportunityMessage(CampaignOpportunityMessage content) {
- day = content.getDay();
- pendingCampaign = new CampaignData(content);
- System.out.println("Day " + day + ": Campaign opportunity - "+ pendingCampaign.id);
- //Your Code Here
- //0.Get Attributes of Campaign ( ReachImpression , Day Start ,Day End, Segments ...)
- //Example long ReachImps = pendingCampaign.getReachImps();
- //1.Build function or any calculation to set value for Campaign bid -> cmpBidMillis;
- //2.Build function or any calculation to set value for ucs bid -> ucs;
- //Create AdNetBidMessage and sent it
- AdNetBidMessage bids = new AdNetBidMessage(ucs, pendingCampaign.id ,cmpBidMillis);
- sendMessage(demandAgentAddress, bids);
- }
- private void handleInitialCampaignMessage(InitialCampaignMessage campaignMessage) {
- day = 0;
- initialCampaignMessage = campaignMessage;
- demandAgentAddress = campaignMessage.getDemandAgentAddress();
- adxAgentAddress = campaignMessage.getAdxAgentAddress();
- }
- @Override
- protected void simulationSetup() {
- day = 0;
- qualityScore = 1.0;
- }
- @Override
- protected void simulationFinished() {
- campaignReports.clear();
- bidBundle = null;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement