Advertisement
Guest User

Untitled

a guest
May 30th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.72 KB | None | 0 0
  1. package tau.tac.adx.agents;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.LinkedList;
  7. import java.util.Map;
  8. import java.util.Queue;
  9. import java.util.Set;
  10. import java.util.logging.Level;
  11. import java.util.logging.Logger;
  12.  
  13. import edu.umich.eecs.tac.props.Ad;
  14. import edu.umich.eecs.tac.props.BankStatus;
  15. import se.sics.isl.transport.Transportable;
  16. import se.sics.tasim.aw.Agent;
  17. import se.sics.tasim.aw.Message;
  18. import se.sics.tasim.props.SimulationStatus;
  19. import se.sics.tasim.props.StartInfo;
  20. import tau.tac.adx.agents.CampaignData;
  21. import tau.tac.adx.ads.properties.AdType;
  22. import tau.tac.adx.demand.CampaignStats;
  23. import tau.tac.adx.devices.Device;
  24. import tau.tac.adx.props.AdxBidBundle;
  25. import tau.tac.adx.props.AdxQuery;
  26. import tau.tac.adx.props.PublisherCatalog;
  27. import tau.tac.adx.props.PublisherCatalogEntry;
  28. import tau.tac.adx.props.ReservePriceInfo;
  29. import tau.tac.adx.report.adn.AdNetworkReport;
  30. import tau.tac.adx.report.adn.MarketSegment;
  31. import tau.tac.adx.report.demand.AdNetBidMessage;
  32. import tau.tac.adx.report.demand.AdNetworkDailyNotification;
  33. import tau.tac.adx.report.demand.CampaignOpportunityMessage;
  34. import tau.tac.adx.report.demand.CampaignReport;
  35. import tau.tac.adx.report.demand.CampaignReportKey;
  36. import tau.tac.adx.report.demand.InitialCampaignMessage;
  37. import tau.tac.adx.report.demand.campaign.auction.CampaignAuctionReport;
  38. import tau.tac.adx.report.publisher.AdxPublisherReport;
  39. import tau.tac.adx.report.publisher.AdxPublisherReportEntry;
  40.  
  41. public class EmptyAgent extends Agent {
  42.  
  43. private final Logger log = Logger.getLogger(EmptyAgent.class.getName());
  44. @SuppressWarnings("unused")
  45. private StartInfo startInfo;
  46.  
  47. //keep all the {@link CampaignReport campaign reports} delivered to the agent.
  48. private final Queue<CampaignReport> campaignReports;
  49. private PublisherCatalog publisherCatalog;
  50. private InitialCampaignMessage initialCampaignMessage;
  51. private AdNetworkDailyNotification adNetworkDailyNotification;
  52.  
  53. //The addresses of server entities to which the agent should send the daily bids data
  54. private String demandAgentAddress;
  55. private String adxAgentAddress;
  56.  
  57. //Information regarding the latest campaign opportunity announced
  58. private CampaignData pendingCampaign;
  59. //We maintain a List (mapped by the campaign id) of the campaigns won by our agent.;
  60. private Map<Integer, CampaignData> myCampaigns;
  61. //the bidBundle to be sent daily to the AdX
  62. private AdxBidBundle bidBundle;
  63.  
  64. // bid level for the user classification service
  65. private double ucs=0;
  66.  
  67.  
  68. // Current day of simulation
  69. private int day;
  70. private String[] publisherNames;
  71. private Long cmpBidMillis;
  72. private double qualityScore;
  73.  
  74.  
  75. public EmptyAgent() {
  76. campaignReports = new LinkedList<CampaignReport>();
  77. myCampaigns = new HashMap<Integer, CampaignData>();
  78. bidBundle = new AdxBidBundle();
  79.  
  80. demandAgentAddress = null;
  81. adxAgentAddress = null;
  82.  
  83. CampaignData campaignData = new CampaignData(initialCampaignMessage);
  84. System.out.println("initialCampaign budget " + initialCampaignMessage.getBudgetMillis() / 1000.0);
  85. campaignData.setBudget(initialCampaignMessage.getBudgetMillis() / 1000.0);
  86. genCampaignQueries(campaignData);
  87. /*
  88. * The initial campaign is already allocated to our agent so we add it
  89. * to our allocated-campaigns list.
  90. */
  91. System.out.println("Day " + day + ": Allocated campaign - " + campaignData);
  92. myCampaigns.put(initialCampaignMessage.getId(), campaignData);
  93. }
  94.  
  95. private void genCampaignQueries(CampaignData campaignData) {
  96. Set<AdxQuery> campaignQueriesSet = new HashSet<AdxQuery>();
  97. for (String PublisherName : publisherNames) {
  98. campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.mobile, AdType.text));
  99. campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.mobile, AdType.video));
  100. campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.pc, AdType.text));
  101. campaignQueriesSet.add(new AdxQuery(PublisherName,campaignData.targetSegment, Device.pc, AdType.video));
  102. }
  103.  
  104.  
  105. }
  106.  
  107. @Override
  108. protected void messageReceived(Message message) {
  109. try {
  110. Transportable content = message.getContent();
  111.  
  112.  
  113. if (content instanceof InitialCampaignMessage) {
  114.  
  115. handleInitialCampaignMessage((InitialCampaignMessage) content);
  116. } else if (content instanceof CampaignOpportunityMessage) {
  117.  
  118. handleICampaignOpportunityMessage((CampaignOpportunityMessage) content);
  119. } else if (content instanceof CampaignReport) {
  120.  
  121. handleCampaignReport((CampaignReport) content);
  122. } else if (content instanceof AdNetworkDailyNotification) {
  123.  
  124. handleAdNetworkDailyNotification((AdNetworkDailyNotification) content);
  125. } else if (content instanceof AdxPublisherReport) {
  126.  
  127. handleAdxPublisherReport((AdxPublisherReport) content);
  128. } else if (content instanceof SimulationStatus) {
  129.  
  130. handleSimulationStatus((SimulationStatus) content);
  131. } else if (content instanceof PublisherCatalog) {
  132.  
  133. handlePublisherCatalog((PublisherCatalog) content);
  134. } else if (content instanceof AdNetworkReport) {
  135.  
  136. handleAdNetworkReport((AdNetworkReport) content);
  137. } else if (content instanceof StartInfo) {
  138.  
  139. handleStartInfo((StartInfo) content);
  140. } else if (content instanceof BankStatus) {
  141.  
  142. handleBankStatus((BankStatus) content);
  143. } else if (content instanceof CampaignAuctionReport) {
  144.  
  145. hadnleCampaignAuctionReport((CampaignAuctionReport) content);
  146. } else if (content instanceof ReservePriceInfo) {
  147.  
  148. // ((ReservePriceInfo)content).getReservePriceType();
  149. } else {
  150. System.out.println("UNKNOWN Message Received: " + content);
  151. }
  152.  
  153. } catch (NullPointerException e) {
  154. this.log.log(Level.SEVERE,
  155. "Exception thrown while trying to parse message." + e);
  156. return;
  157. }
  158.  
  159. }
  160.  
  161.  
  162.  
  163. private void hadnleCampaignAuctionReport(CampaignAuctionReport content) {
  164.  
  165. }
  166.  
  167. private void handleBankStatus(BankStatus content) {
  168. System.out.println("Day " + day + " :" + content.toString());
  169.  
  170. }
  171.  
  172. private void handleStartInfo(StartInfo content) {
  173. this.startInfo = content;
  174.  
  175. }
  176.  
  177. private void handleAdNetworkReport(AdNetworkReport content) {
  178. System.out.println("Day " + day + " : AdNetworkReport");
  179.  
  180. }
  181.  
  182. private void handlePublisherCatalog(PublisherCatalog content) {
  183. this.publisherCatalog = content;
  184. getPublishersNames();
  185. }
  186. private void getPublishersNames() {
  187. if (null == publisherNames && publisherCatalog != null) {
  188. ArrayList<String> names = new ArrayList<String>();
  189. for (PublisherCatalogEntry pce : publisherCatalog) {
  190. names.add(pce.getPublisherName());
  191. }
  192.  
  193. publisherNames = new String[names.size()];
  194. names.toArray(publisherNames);
  195. }
  196. }
  197.  
  198. private void handleSimulationStatus(SimulationStatus content) {
  199. System.out.println("Day " + day + " : Simulation Status Received");
  200. //Send the daily bid for impressions
  201. sendBidAndAds();
  202. System.out.println("Day " + day + " ended. Starting next day");
  203.  
  204. ++day;
  205. log.log( Level.FINE, "Processing to day {0} entries in loop",day );
  206.  
  207.  
  208. }
  209.  
  210. private void sendBidAndAds() {
  211. //Your code Here
  212. bidBundle = new AdxBidBundle();
  213. int dayBiddingFor = day + 1;
  214.  
  215. //The bid you want for the impression should be changed
  216. double rbid = 0;
  217.  
  218. for (CampaignData campaign : myCampaigns.values()) {
  219.  
  220.  
  221. for (AdxQuery query : campaign.campaignQueries) {
  222. /*
  223. * among matching entries with the same campaign id, the AdX
  224. * randomly chooses an entry according to the designated
  225. * weight. by setting a constant weight 1, we create a
  226. * uniform probability over active campaigns
  227. */
  228. //Set the bid for the query
  229. rbid = 0;
  230.  
  231. bidBundle.addQuery(query, rbid, new Ad(null),campaign.id, 1);
  232. }
  233.  
  234. // Setting the limits
  235. double impressionLimit = campaign.impsTogo();
  236. double budgetLimit = campaign.budget;
  237. bidBundle.setCampaignDailyLimit(campaign.id,(int) impressionLimit, budgetLimit);
  238.  
  239. System.out.println("Day " + day+ ": Updated Bid Bundle entries " + "for Campaign id "+ campaign.id);
  240. }
  241.  
  242. if (bidBundle != null) {
  243. System.out.println("Day " + day + ": Sending BidBundle");
  244. if (adxAgentAddress != null)
  245. sendMessage(adxAgentAddress, bidBundle);
  246. }
  247. }
  248.  
  249. private void handleAdxPublisherReport(AdxPublisherReport adxPublisherReport) {
  250. System.out.println("Publishers Report: ");
  251. for (PublisherCatalogEntry publisherKey : adxPublisherReport.keys()) {
  252. AdxPublisherReportEntry entry = adxPublisherReport.getEntry(publisherKey);
  253. System.out.println(entry.toString());
  254. }
  255.  
  256. //You code Here
  257. //Optional if you want to use the attribute of the report - i didn't use
  258. }
  259.  
  260. private void handleAdNetworkDailyNotification(AdNetworkDailyNotification notificationMessage) {
  261. // TODO Auto-generated method stub
  262. adNetworkDailyNotification = notificationMessage;
  263.  
  264. System.out.println("Day " + day + ": Daily notification for campaign "
  265. + adNetworkDailyNotification.getCampaignId());
  266.  
  267. String campaignAllocatedTo = "CAMPAGIN Allocated to "+ notificationMessage.getWinner();
  268.  
  269. //Won
  270. if ((pendingCampaign != null)&& (pendingCampaign.id == adNetworkDailyNotification.getCampaignId())
  271. && (notificationMessage.getCostMillis() != 0)) {
  272.  
  273. pendingCampaign.setBudget(notificationMessage.getCostMillis() / 1000.0);
  274.  
  275. //You Code Here
  276.  
  277. //Optional if you want to save any data on the won campagin
  278.  
  279.  
  280. genCampaignQueries(pendingCampaign);
  281. myCampaigns.put(pendingCampaign.id, pendingCampaign);
  282.  
  283. campaignAllocatedTo = " CAMPAGIN WON at cost (Millis)"+ notificationMessage.getCostMillis();
  284. }
  285.  
  286.  
  287. qualityScore = notificationMessage.getQualityScore();
  288.  
  289. System.out
  290. .println("Day " + day + ": " + campaignAllocatedTo
  291. + ". UCS Level set to "
  292. + notificationMessage.getServiceLevel() + " at price "
  293. + notificationMessage.getPrice()
  294. + " Quality Score is: "
  295. + notificationMessage.getQualityScore());
  296.  
  297. }
  298.  
  299. private void handleCampaignReport(CampaignReport content) {
  300.  
  301. campaignReports.add(content);
  302. for (CampaignReportKey campaignKey : content.keys()) {
  303. int cmpId = campaignKey.getCampaignId();
  304. CampaignStats cstats = content.getCampaignReportEntry(
  305. campaignKey).getCampaignStats();
  306. myCampaigns.get(cmpId).setStats(cstats);
  307.  
  308. System.out.println("Day " + day + ": Updating campaign " + cmpId
  309. + " stats: " + cstats.getTargetedImps() + " tgtImps "
  310. + cstats.getOtherImps() + " nonTgtImps. Cost of imps is "
  311. + cstats.getCost());
  312. }
  313.  
  314. //Your Code Here
  315. //Optional if you want to use report details to change the bid
  316.  
  317. }
  318.  
  319.  
  320. private void handleICampaignOpportunityMessage(CampaignOpportunityMessage content) {
  321. day = content.getDay();
  322.  
  323. pendingCampaign = new CampaignData(content);
  324. System.out.println("Day " + day + ": Campaign opportunity - "+ pendingCampaign.id);
  325.  
  326.  
  327. //Your Code Here
  328.  
  329. //0.Get Attributes of Campaign ( ReachImpression , Day Start ,Day End, Segments ...)
  330. //Example long ReachImps = pendingCampaign.getReachImps();
  331.  
  332. //1.Build function or any calculation to set value for Campaign bid -> cmpBidMillis;
  333.  
  334. //2.Build function or any calculation to set value for ucs bid -> ucs;
  335.  
  336. //Create AdNetBidMessage and sent it
  337. AdNetBidMessage bids = new AdNetBidMessage(ucs, pendingCampaign.id ,cmpBidMillis);
  338. sendMessage(demandAgentAddress, bids);
  339.  
  340. }
  341.  
  342. private void handleInitialCampaignMessage(InitialCampaignMessage campaignMessage) {
  343. day = 0;
  344. initialCampaignMessage = campaignMessage;
  345. demandAgentAddress = campaignMessage.getDemandAgentAddress();
  346. adxAgentAddress = campaignMessage.getAdxAgentAddress();
  347.  
  348. }
  349.  
  350. @Override
  351. protected void simulationSetup() {
  352. day = 0;
  353. qualityScore = 1.0;
  354.  
  355.  
  356. }
  357.  
  358. @Override
  359. protected void simulationFinished() {
  360. campaignReports.clear();
  361. bidBundle = null;
  362.  
  363. }
  364.  
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement