/farmR/src/java/src/jfm/model/Output.java

https://code.google.com/p/javawfm/ · Java · 141 lines · 113 code · 13 blank · 15 comment · 18 complexity · 918aef12ef6793bc0e004969181dfe39 MD5 · raw file

  1. package jfm.model;
  2. import java.util.*;
  3. import jfm.model.Crop.CropCopy;
  4. import jfm.model.Types.*;
  5. import jfm.utils.*;
  6. import jfm.lp.*;
  7. /** Static functions to extract solution information from model objects.
  8. * @author Ira Cooke */
  9. public final class Output {
  10. public static String oneLineSummary(Farm farm){
  11. StringBuffer buff=new StringBuffer();
  12. Map<Double,CropType> cropAreas=new HashMap<Double,CropType>();
  13. for(CropType ct:farm.cropping.baseCropTypes()){
  14. cropAreas.put(farm.cropping.getCrop(ct).getSolvedArea(),ct);
  15. }
  16. buff.append("Total: "+MathPrint.f2.format(farm.landUse.getArea())+" ");
  17. List<Double> areas = new ArrayList<Double>(cropAreas.keySet());
  18. Collections.sort(areas);
  19. int numDisplay=Math.min(areas.size(),6);
  20. for(int i=0;i<numDisplay;i++){
  21. Double a=areas.get(areas.size()-1-i);
  22. buff.append(cropAreas.get(a).shortName+": "+MathPrint.f2.format(a)+" ");
  23. }
  24. return buff.toString();
  25. }
  26. public static String formulaChecks(Farm farm){
  27. StringBuffer buff=new StringBuffer();
  28. for (Crop cp:farm.cropping.getCrops().values()){
  29. buff.append(cp.type+"\n");
  30. buff.append(cp.printFormulaCheck(farm.location()));
  31. }
  32. return buff.toString();
  33. }
  34. /** Print a breakdown of the profit components for a Farm.
  35. * @param farm The farm to summarize
  36. * @param useMarginals Flag whether to print marginal (per ha) values or total values
  37. * */
  38. public static String profitSummary(Farm farm,boolean useMarginals){
  39. StringBuffer buff=new StringBuffer();
  40. double totalProfit=0;
  41. for(CropType ct:farm.cropping.baseCropTypes()){
  42. for ( CropCopy cc:farm.cropping.getCrop(ct).getYearCopies()){
  43. if ( cc.getSolvedArea() > 0 ){
  44. Map<String,Double> profits=cc.getProfitSummary(useMarginals);
  45. buff.append(cc.name()+" "+profits.get("Total")+" "+profits.get("Gross")+" "+profits.get("OpPenalty")+" "+profits.get("OpFuel"));
  46. buff.append("\n");
  47. totalProfit+=profits.get("Total");
  48. }
  49. }
  50. }
  51. buff.append("Total: "+totalProfit);
  52. return buff.toString();
  53. }
  54. /** Print a breakdown of the profit components for a Farm.
  55. * @param farm The farm to summarize
  56. * @param useMarginals Flag whether to print marginal (per ha) values or total values
  57. * */
  58. public static String detailedObjectiveSummary(Farm farm){
  59. StringBuffer buff=new StringBuffer();
  60. int columnWidth=15; // Allow 15 characters per column
  61. Map<ObjectiveType,Objective> objs=farm.getObjectives();
  62. for(ObjectiveType obj:objs.keySet()){
  63. buff.append(obj+":"+MathPrint.f2.format(farm.getValueForObjective(obj))+" "+
  64. MathPrint.f2.format(objs.get(obj).scaleFactor())+" "+
  65. MathPrint.f2.format(objs.get(obj).scaleFactor()*farm.getValueForObjective(obj))+"\n");
  66. }
  67. for(CropType ct:farm.cropping.baseCropTypes()){
  68. for ( CropCopy cc:farm.cropping.getCrop(ct).getYearCopies()){
  69. if ( cc.getSolvedArea() > 0 ){
  70. buff.append(cc.getDetailedProfitBreakdown(columnWidth));
  71. }
  72. }
  73. }
  74. return buff.toString();
  75. }
  76. /** Print a summary of the workload in each period */
  77. public static String workloadSummary(Farm farm){
  78. StringBuffer buff=new StringBuffer();
  79. Map<Integer,LinkedHashMap<Object,Double>> workLoad=farm.workers.getWorkload();
  80. if ( farm.objectives().containsKey(ObjectiveType.FREETIME)){
  81. FreeTimeComponent ftc=(FreeTimeComponent)farm.getModelComponent(ModelComponent.MCType.FREETIME);
  82. Map<Integer,Double> ft=ftc.getSolvedFreeTime();
  83. for (int p=0;p<workLoad.size();p++){
  84. Map<Object,Double> work=workLoad.get(p);
  85. work.put(ObjectiveType.FREETIME, ft.get(p));
  86. }
  87. }
  88. ArrayList<Object> masterKeys=new ArrayList<Object>(workLoad.get(0).keySet());
  89. for( Object key:masterKeys){
  90. buff.append(key+",");
  91. }
  92. buff.deleteCharAt(buff.length()-1);
  93. buff.append("\n");
  94. for(int p=0;p<farm.numPeriods;p++){
  95. for ( Object key:masterKeys){
  96. buff.append(MathPrint.f2.format(workLoad.get(p).get(key))+",");
  97. }
  98. buff.deleteCharAt(buff.length()-1);
  99. buff.append("\n");
  100. }
  101. return buff.toString();
  102. }
  103. /** Print a summary of the solved model components for this farm.
  104. * @param farm The farm to be summarized
  105. * @param detailed Flag whether to print complete detail or not
  106. * */
  107. public static String solution(Farm farm,boolean detailed){
  108. StringBuffer buff = new StringBuffer();
  109. for (Objective op:farm.objectives().values()){
  110. buff.append(op.type+": " +MathPrint.df2.format(farm.getValueForObjective(op.type))+"\n");
  111. }
  112. if ( farm.getComponents().keySet().contains(ModelComponent.MCType.HEDGEROWS) ){
  113. buff.append("\n-- Hedge Length: "+farm.getValueForObjective(ObjectiveType.HEDGEROWS)+"\n");
  114. }
  115. if ( farm.getComponents().keySet().contains(ModelComponent.MCType.ELSOPTIONS)){
  116. ELSOptionsComponent comp = (ELSOptionsComponent)farm.getModelComponent(ModelComponent.MCType.ELSOPTIONS);
  117. buff.append("\n-- ELS Options Summary --\n"+comp.printSolution());
  118. }
  119. buff.append("\n"+farm.cropping.printSolution(farm,detailed)+" \n");
  120. buff.append(farm.rotations.printSolution()+"\n ");
  121. buff.append(farm.workers.printSolution(farm));
  122. buff.append("\n"+farm.workers.printFixedCosts(farm)+"\n");
  123. return buff.toString();
  124. }
  125. public static String csvWorkPlan(Farm farm){
  126. return farm.cropping.printCSVWorkPlan();
  127. }
  128. }