Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.26 KB | None | 0 0
  1. package heca;
  2.  
  3. import java.sql.Time;
  4.  
  5. public class Appliance{
  6. String applianceCategory; //e.g Electricity
  7. ApplianceType applianceType; //e.g StrictAppliance like Refrigerator
  8. String applianceName; //e.g WashingMachine
  9. int usageTime;
  10. Time scheduledTime;
  11.  
  12. public Appliance(String applianceCategory, ApplianceType applianceType, String applianceName, int usageTime,Time scheduledTime) {
  13. this.applianceCategory = applianceCategory;
  14. this.applianceType = applianceType;
  15. this.applianceName = applianceName;
  16. this.usageTime = usageTime;
  17. this.scheduledTime = scheduledTime;
  18. }
  19.  
  20.  
  21. }
  22.  
  23. package heca;
  24.  
  25. public class Attribute{
  26. String attibuteName; //e.g WindPower
  27. double perUnitWeight;
  28. int consumed;
  29. int limit;
  30.  
  31. public static class Builder {
  32. //required
  33. private String attibuteName;
  34. //optional
  35. private double perUnitWeight;
  36. private int consumed;
  37. private int limit;
  38.  
  39. public Builder(String size) {
  40. this.attibuteName = size;
  41. }
  42.  
  43. public Builder perUnitWeight(double value) {
  44. perUnitWeight = value;
  45. return this;
  46. }
  47.  
  48. public Builder consumed(int value) {
  49. consumed = value;
  50. return this;
  51. }
  52.  
  53. public Builder limit(int value) {
  54. limit = value;
  55. return this;
  56. }
  57.  
  58. public Attribute build() {
  59. return new Attribute(this);
  60. }
  61. }
  62.  
  63. private Attribute(Builder builder) {
  64. attibuteName = builder.attibuteName;
  65. perUnitWeight = builder.perUnitWeight;
  66. consumed = builder.consumed;
  67. limit = builder.limit;
  68. }
  69.  
  70. public Attribute(String a){
  71. this(a, 0.0, 0, (int)1e6);
  72.  
  73. }
  74. public Attribute(String a, double w, int m, int l){
  75. attibuteName = a;
  76. perUnitWeight = w;
  77. consumed = m;
  78. limit = l;
  79.  
  80. }
  81. public String toString(){
  82. StringBuilder sb = new StringBuilder();
  83. sb.append("ntattibute : "+this.attibuteName+"tConsumed :"+ this.consumed + "tLimit : "+ this.limit);
  84. return sb.toString();
  85. }
  86.  
  87. @Override
  88. public int hashCode() {
  89. final int prime = 31;
  90. int result = 1;
  91. result = prime * result + ((attibuteName == null) ? 0 : attibuteName.hashCode());
  92. return result;
  93. }
  94.  
  95. @Override
  96. public boolean equals(Object obj) {
  97. if (this == obj)
  98. return true;
  99. if (obj == null)
  100. return false;
  101. if (getClass() != obj.getClass())
  102. return false;
  103. Attribute other = (Attribute) obj;
  104. if (attibuteName == null) {
  105. if (other.attibuteName != null)
  106. return false;
  107. } else if (!attibuteName.equals(other.attibuteName))
  108. return false;
  109. return true;
  110. }
  111. }
  112.  
  113. package heca;
  114.  
  115. import java.sql.Time;
  116. import java.util.List;
  117. import java.util.Map;
  118.  
  119. public interface Controller {
  120. public String createUser(String userName);
  121. public boolean addAppliance(String userId,String applianceCategory);
  122. public boolean addAppliance(String userId, String applianceCategory,List<Attribute> attribs);
  123. public void addAttribute(String userId,String applianceCategory,String attributeName);
  124. public void updateConsumption(String userId,String applianceCategory,String attributeName,int updatedValue);
  125. public List<Attribute> getMAXExpenses(String userId);
  126. public List<Attribute> getMINExpenses(String userId);
  127. public Map<String,List<Attribute>> getAllConsumptionDetails(String userId);
  128. public List<Attribute> getSpecificConsumptionDetails(String userId,String applianceCategory);
  129. public Score getScore();
  130. public Badge getBadge();
  131. public List<Attribute> getSuggestedOptimizedGoal(String userId,String applianceCategory,int target);
  132. public boolean modifyGoal(String userId,String applianceCategory,String attributeName,int targetValue);
  133. public boolean scheduleFlexibleAppliance(String userId,String applianceCategory, Appliance applianceName,Time schedule);
  134.  
  135. }
  136.  
  137. package heca;
  138.  
  139. import java.util.Comparator;
  140.  
  141. public class CostComparator implements Comparator<Attribute>{
  142.  
  143. // fractional knapsack comparator having only Weight(weight per unit) but all items are unbounded..same Value...Hence value ignored
  144. @Override
  145. public int compare(Attribute o1, Attribute o2) {
  146. return ((o1.limit -o1.consumed)*(int)o1.perUnitWeight ) - ((o2.limit -o2.consumed)*(int)o2.perUnitWeight ) > 0 ? 1:0 ;
  147. }
  148.  
  149. }
  150.  
  151. package heca;
  152.  
  153. import java.util.ArrayList;
  154. import java.util.List;
  155. import java.util.PriorityQueue;
  156. import java.util.Queue;
  157. import java.util.concurrent.ConcurrentHashMap;
  158.  
  159. public class EnergyTracker{
  160.  
  161. ConcurrentHashMap<String,List<Attribute>> appliances = new ConcurrentHashMap<>(); //AdjacencyMatrix
  162. Queue<Attribute> maxExpenseHeap = new PriorityQueue<>(20, new CostComparator());
  163. Queue<Attribute> minExpenseHeap = new PriorityQueue<>(20, new CostComparator().reversed());
  164.  
  165. public List<Attribute> getApplianceDetails(String aplianceName){
  166. if(appliances.containsKey(aplianceName))return appliances.get(aplianceName);
  167. else return new ArrayList<>();
  168. }
  169. public void setApplianceDetails(String aplianceName,List<Attribute> attribs){
  170. List<Attribute> renewedAttribs = appliances.get(aplianceName);
  171. if(renewedAttribs==null || renewedAttribs.isEmpty())
  172. renewedAttribs = attribs;
  173. else if(appliances.containsKey(aplianceName)){
  174. renewedAttribs.addAll(attribs);
  175. }
  176. appliances.put(aplianceName,renewedAttribs);
  177. renewedAttribs.forEach((attrib )-> this.maxExpenseHeap.offer(attrib));
  178. renewedAttribs.forEach((attrib )-> this.minExpenseHeap.offer(attrib));
  179.  
  180. }
  181.  
  182. public ConcurrentHashMap<String,List<Attribute>> getALLApplianceDetails() {
  183. return appliances;
  184. }
  185.  
  186. public List<Attribute> get_TopK_MINConsumptionAppliance(int K){
  187. ArrayList<Attribute> top5minConsumption = new ArrayList<>(K);
  188. Attribute temp =null;
  189. for( int i =0; i<K && K< minExpenseHeap.size() && i < minExpenseHeap.size(); ){
  190. temp = minExpenseHeap.poll();
  191. top5minConsumption.add(temp);
  192. minExpenseHeap.offer(temp);
  193. i++;
  194. }
  195. return top5minConsumption;
  196. }
  197.  
  198. public List<Attribute> get_TopK_MAXConsumptionAppliance(int K){
  199. ArrayList<Attribute> top5minConsumption = new ArrayList<>(K);
  200. Attribute temp =null;
  201. for( int i =0; i<K && K< maxExpenseHeap.size() && i < maxExpenseHeap.size(); ){
  202. temp = maxExpenseHeap.poll();
  203. top5minConsumption.add(temp);
  204. maxExpenseHeap.offer(temp);
  205. }
  206. return top5minConsumption;
  207. }
  208. }
  209.  
  210. package heca;
  211.  
  212. public class HomeUser{
  213.  
  214. String userId;
  215.  
  216. EnergyTracker targetExpenseTracker = new EnergyTracker();
  217. EnergyTracker actualExpenseTracker = new EnergyTracker();
  218.  
  219. int targetExpenseGoal, monthlyBudget, tillNowExpense;
  220.  
  221. public HomeUser(String uID){
  222. userId = uID;
  223. }
  224.  
  225. /* <TODO> calculate based on :
  226. getSavings()
  227. getGoalAchieved()
  228. */
  229. public Badge showBadgesAndIncentives(){
  230. return Badge.SILVER;
  231. }
  232. /* <TODO> judge based on
  233. total consumption cost of all Appliances -> Attribute -> consumed*perUnitWeight
  234. */
  235. public Score getScore(){
  236. return Score.CONSUMES_MEDIUM;
  237. }
  238.  
  239.  
  240. private int getGoalAchieved(){
  241. return targetExpenseGoal;
  242. }
  243. private int getSavings(){
  244. return monthlyBudget - tillNowExpense;
  245. }
  246.  
  247.  
  248.  
  249. //setters
  250.  
  251. public void setTargetExpenseGoal(int targetExpenseGoal) {
  252. this.targetExpenseGoal = targetExpenseGoal;
  253. }
  254.  
  255. public void setMonthlyBudget(int monthlyBudget) {
  256. this.monthlyBudget = monthlyBudget;
  257. }
  258.  
  259. public void setTillNowExpense(int tillNowExpense) {
  260. this.tillNowExpense = tillNowExpense;
  261. }
  262.  
  263. }
  264.  
  265. package heca;
  266.  
  267. import java.util.HashMap;
  268.  
  269. public class UserDB{
  270. HashMap<String,HomeUser> usserMap = new HashMap<>();
  271.  
  272. public void addUser(String userId,HomeUser u){
  273. usserMap.put(userId, u);
  274. }
  275.  
  276. public HomeUser getUser(String userId){
  277. return usserMap.get(userId);
  278. }
  279. }
  280.  
  281. package heca;
  282.  
  283.  
  284. import java.sql.Time;
  285. import java.util.ArrayList;
  286. import java.util.Collections;
  287. import java.util.List;
  288. import java.util.Map;
  289.  
  290.  
  291.  
  292. public class DesignHECA implements Controller {
  293.  
  294. private UserDB userDB = new UserDB();
  295.  
  296. @Override
  297. public String createUser(String userName) {
  298. String userId = userName+ new java.util.Random();
  299. HomeUser u = new HomeUser(userId);
  300. userDB.addUser(userId,u);
  301. return userId ;
  302. }
  303.  
  304. public HomeUser getUser(String userId) {
  305. return userDB.getUser(userId);
  306. }
  307.  
  308.  
  309. /*----------------------- addAppliance ----------------------------------------*/
  310. @Override
  311. public boolean addAppliance(String userId, String applianceCategory) {
  312. if(applianceCategory == null || applianceCategory.isEmpty()) return false;
  313. else getUser(userId).actualExpenseTracker.setApplianceDetails(applianceCategory,new ArrayList<>()); //telescoping
  314. return true;
  315.  
  316. }
  317. @Override
  318. public boolean addAppliance(String userId, String applianceCategory,final List<Attribute> attribs){ // not to be leaked to Client
  319.  
  320. HomeUser user = getUser(userId);
  321.  
  322. if(applianceCategory == null || applianceCategory.isEmpty()) return false;
  323. else
  324. if(!user.actualExpenseTracker.appliances.containsKey(applianceCategory)){
  325. user.actualExpenseTracker.setApplianceDetails(applianceCategory,attribs); //defensive copy
  326. }else{
  327. List<Attribute> prev = user.actualExpenseTracker.appliances.getOrDefault(applianceCategory, new ArrayList<>());
  328. prev.addAll(attribs); //handling override left for brevity
  329. user.actualExpenseTracker.setApplianceDetails(applianceCategory,prev);
  330. }
  331. return true;
  332. }
  333.  
  334.  
  335. /*----------------------- addAttribute ----------------------------------------*/
  336. @Override
  337. public void addAttribute(String userId, String applianceCategory, String attributeName) {
  338. List<Attribute> attribs = new ArrayList<>();
  339. Attribute attribute = new Attribute(attributeName);
  340. attribs.add(attribute);
  341.  
  342. addAppliance(userId, applianceCategory,attribs);
  343.  
  344. }
  345.  
  346. /*----------------------- updateConsumption ----------------------------------------*/
  347. @Override
  348. public void updateConsumption(String userId, String applianceCategory, String attributeName, int tillNowConsumed) {
  349. //left intentionally for brevity
  350. }
  351.  
  352. /*----------------------- getMAXExpenses ----------------------------------------*/
  353. @Override
  354. public List<Attribute> getMAXExpenses(String userId) {
  355. HomeUser user = getUser(userId);
  356. return user.actualExpenseTracker.get_TopK_MAXConsumptionAppliance(10);
  357. }
  358.  
  359. /*----------------------- getMINExpenses ----------------------------------------*/
  360. @Override
  361. public List<Attribute> getMINExpenses(String userId) {
  362. HomeUser user = getUser(userId);
  363. return user.actualExpenseTracker.get_TopK_MINConsumptionAppliance(10);
  364. }
  365. /*----------------------- getAllConsumptionDetails ----------------------------------------*/
  366. @Override
  367. public Map<String, List<Attribute>> getAllConsumptionDetails(String userId) {
  368. HomeUser user = getUser(userId);
  369. return user.actualExpenseTracker.getALLApplianceDetails();
  370. }
  371.  
  372.  
  373. /*----------------------- getSpecificConsumptionDetails ----------------------------------------*/
  374. @Override
  375. public List<Attribute> getSpecificConsumptionDetails(String userId, String applianceCategory) {
  376. HomeUser user = getUser(userId);
  377. //checks omitted for brevity
  378. return user.actualExpenseTracker.getApplianceDetails(applianceCategory);
  379.  
  380. }
  381.  
  382. /*----------------------- modifyGoal - lets user to newly calibrate his target expenses ---*/
  383. @Override
  384. public boolean modifyGoal(String userId, String applianceCategory, String attributeName, int newlimit) {
  385. HomeUser user = getUser(userId);
  386. List<Attribute> attribs = user.targetExpenseTracker.getApplianceDetails(applianceCategory);
  387. Attribute temp =null;
  388. for(int i=0; i<attribs.size();i++){
  389. if(attributeName.equals(attribs.get(i).attibuteName)){
  390. temp =attribs.remove(i);
  391. temp.limit = newlimit;
  392. attribs.add(temp);
  393. user.targetExpenseTracker.setApplianceDetails(applianceCategory,attribs);
  394. return true;
  395. }
  396. }
  397. return false;
  398. }
  399.  
  400. /*---------------------- getSuggestedOptimizedGoals ------------------------------
  401. * This method Suggests optimized path(Top 5 MIN Expense) for Goal if calibration set by User predicted to meet target
  402. * */
  403. @Override
  404. public List<Attribute> getSuggestedOptimizedGoal(String userId,String applianceCategory,int target) {
  405. HomeUser user = getUser(userId);
  406. List<Attribute> attribs = user.actualExpenseTracker.getApplianceDetails(applianceCategory);
  407. /* e.g
  408. "PowerSupply",340,880
  409. "WindPower",120,1
  410. "SolarEnergy",10,2
  411.  
  412. int[] w ={880,1,2};
  413. int[] c ={340,120,10};
  414.  
  415. if( this.canProduce(c,w,user.monthlyBudget -user.tillNowExpense) > 0){ //optimiseed combination
  416. return this.getMINExpenses(userId);
  417. }
  418. else
  419. return new ArrayList<>();
  420. */
  421. return this.getMINExpenses(userId);
  422. }
  423. public int canProduce(int[] c,int[] w, int W){
  424. return min_cost(c.length,W,c,w);
  425. }
  426.  
  427. // Dynamic programming to compute Minimum Cost Path for fixed Weight
  428. public int min_cost(int N, int W,int[] c, int[] w){
  429. // min_cost(i, W) = min(min_cost(i+1, W), min_cost(i, W - w[i]) + c[i])
  430.  
  431. int[][] dp = new int[N][W];
  432. int i=0;
  433.  
  434. //base cases
  435. if(dp[i][0] == 0 ) return 1; // We already reached our goal
  436. if(W < 0 || i > N) dp[i][W] = Integer.MIN_VALUE; // if (W < 0 or i > N) then we can't get to W
  437.  
  438. dp[i][ W] = Math.min(min_cost(i+1, W,c,w), min_cost(i, W - w[i],c,w) + c[i]);
  439.  
  440. if(dp[N][ W] <= W)
  441. return dp[N][ W];
  442. else
  443. return 0;//impossible --need to re calibrate
  444. }
  445.  
  446.  
  447. @Override
  448. public boolean scheduleFlexibleAppliance(String userId,String applianceCategory, Appliance applianceName,Time schedule) {
  449. // TODO omitted for brevity
  450. return false;
  451. }
  452.  
  453. @Override
  454. public Score getScore() {
  455. // TODO omitted for brevity
  456. return null;
  457. }
  458.  
  459. @Override
  460. public Badge getBadge() {
  461. // TODO omitted for brevity
  462. return null;
  463. }
  464.  
  465. /*------------Driver Program -----------------------------------------------------------*/
  466. public static void main(String args[] ) throws Exception {
  467.  
  468. DesignHECA d = new DesignHECA();
  469. String userId = d.createUser("Chandra");
  470.  
  471. /** Create Attribute */
  472. List<Attribute> attributeList1 = new ArrayList<>();
  473. attributeList1.add( new Attribute.Builder("CarOil").perUnitWeight(80.0).consumed(20).limit(60).build());
  474. attributeList1.add( new Attribute.Builder("CookingOil").perUnitWeight(60.0).consumed(4).limit(12).build());
  475. attributeList1.add( new Attribute.Builder("CandleOil").perUnitWeight(12.0).consumed(2).limit(10).build());
  476. List<Attribute> attributeList2 = new ArrayList<>();
  477. attributeList2.add( new Attribute.Builder("CrudeOil").perUnitWeight(12.0).consumed(10).limit(80).build());
  478.  
  479. List<Attribute> attributeList3 = new ArrayList<>();
  480. attributeList3.add( new Attribute("PowerSupply",340.0,880,60));
  481. attributeList3.add( new Attribute("WindPower",120.0,1,2));
  482. List<Attribute> attributeList4 = new ArrayList<>();
  483. attributeList4.add( new Attribute("SolarEnergy",0.0,0,2));
  484.  
  485. /** Create ApplapplianceCategorydd Attributes */
  486. d.addAppliance(userId,"Fuel",attributeList1);
  487. d.addAppliance(userId,"Fuel",attributeList2);
  488. d.addAppliance(userId,"Electricity",attributeList3);
  489. d.addAppliance(userId,"Electricity",attributeList4);
  490.  
  491. /** Optimize Electric Consumption */
  492.  
  493. /*------------show Electric consumption ----------------------------------------------------------------*/
  494. d.getAllConsumptionDetails(userId).forEach((k,v)-> System.out.println(k+" : "+v));
  495.  
  496. /*------------show Suggested Paths ----------------------------------------------------------------------*/
  497. System.out.println(d.getSpecificConsumptionDetails(userId,"Electricity"));
  498. System.out.println(d.getSuggestedOptimizedGoal(userId,"Electricity",9000)); //DP based on Graph
  499.  
  500. /*------------user can opt to re-calibrating his target ---------------------------------------------------*/
  501. d.modifyGoal(userId,"Electricity","PowerSupply", 600);
  502.  
  503. /*------------user can opt to schedule Washing Machine ---------------------------------------------------*/
  504. //d.scheduleFlexibleAppliance(userId,"Electricity", "WashingMachine", new Time(11,30,20));
  505.  
  506.  
  507. }
  508.  
  509.  
  510.  
  511. /* *********************************************
  512. <TODO> : Implement following Business Methods
  513. =============================================
  514. --remmoveAppliance()
  515. --getTargetGoal()
  516. --getProjectSavings()
  517. --getBadgesAndIncentives()
  518. --calculateDeviation()
  519. --getSuggestedOptimizedGoals("Electric") DP based on Graph
  520. */
  521. /*----Constructor-------------*/
  522. public DesignHECA(){ init(); }
  523.  
  524.  
  525. /*----Utility & Loaders-------*/
  526. public void init() { } //can be populated from File system
  527.  
  528.  
  529. }
  530.  
  531. enum ApplianceType{
  532. STRICT, FLEXIBLE;
  533. }
  534. enum Goal{
  535. EXCELLENT,GOAL_ACHIEVED,EXCEEDED;
  536. }
  537. enum Badge{
  538.  
  539.  
  540. // Badge with Incentive
  541. COPPER(100),SILVER(300),GOLD(800);
  542.  
  543. private int intValue;
  544. private String abbreviation;
  545.  
  546. private Badge(final int intValue) {
  547. this.intValue = intValue;
  548. }
  549. private Badge(String value) {
  550. this.abbreviation = value;
  551. }
  552. //lookup a Java enum from its ordinals
  553. private static Badge[] values = Badge.values();
  554. public static Badge getByID(int i) {
  555. return (values[i - 1] != null)? values[i - 1] : Badge.values()[i];
  556. }
  557.  
  558. }
  559.  
  560.  
  561. enum Score{
  562. CONSUMES_LOW, CONSUMES_MEDIUM, CONSUMES_HIGH, CONSUMES_PEAK;
  563. }
  564.  
  565. @lombok.Data
  566. public class Appliance {
  567. private final String applianceCategory; //e.g Electricity
  568. private final ApplianceType applianceType; //e.g StrictAppliance like Refrigerator
  569. private final String applianceName; //e.g WashingMachine
  570. private final int usageTime;
  571. private final Time scheduledTime;
  572. }
  573.  
  574. data class Appliance(
  575. val category: String, //e.g Electricity
  576. val type: ApplianceType, //e.g StrictAppliance like Refrigerator
  577. val name: String, //e.g WashingMachine
  578. val usageTime: int,
  579. val scheduledTime: Time)
  580.  
  581. new Attribute("WindPower", 3.4, 13, 500)
  582.  
  583. Appliance(
  584. category = "Electricity",
  585. type = ApplianceType.StrictAppliance,
  586. name = "WashingMachine",
  587. usageTime = 13,
  588. scheduledTime = Time(1234L))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement