package actor; import generated.ConstraintType; import input.InputReader; import java.util.Enumeration; import logic.IterativeBruteForceSolver; import org.w3c.dom.Document; import data.Derivative; import data.FinishedProduct; import data.RawMaterial; /** * Derivative buying agent * * @author Rukmal Fernando * @author Hardik Kotecha * @author Radhika Srinivasan */ public class BuyingAgent { private static final float ratio = 4f/9f; private static final float worstCaseQualityTable [][] = new float[][] {{1f, ratio / 3, 2 * ratio / 3, ratio}, {ratio / 3, 0.33f, 5 * ratio / 6, 7 * ratio / 6}, {2 * ratio / 3, 5 * ratio / 6, 0.5f, 4 * ratio / 3}, {ratio, 7 * ratio / 6, 4 * ratio / 3, 0.75f}}; /** * default constructor */ public BuyingAgent(){} /** * determine if the given derivative is a good buy or not * * @param pDerivative : Derivative * @return float */ public float checkDerivative( Derivative pDerivative ) { Float derivativePrice = pDerivative.getPrice().getValue(); Enumeration constraintTypeEnum = pDerivative.getType().getInnerType().get_constrainttype_list().elements(); // Go through list int numElements = 0; float minWorstCaseQuality = 1; boolean allZeroWorks = true; boolean allOneWorks = true; while (constraintTypeEnum.hasMoreElements()) { numElements++; int relationNumber = ((ConstraintType)constraintTypeEnum.nextElement()).get_relation().get_v(); float worstCaseQuality = getWorstCaseQuality(relationNumber); if (minWorstCaseQuality > worstCaseQuality) { minWorstCaseQuality = worstCaseQuality; } if (relationNumber > 127) { allOneWorks = false; } if (relationNumber % 2 == 0) { allZeroWorks = false; } } // If all 0 or 1 works, alt quality is 1 float alternateMin; if (allZeroWorks || allOneWorks) { alternateMin = 1f; } else { // Alternate worst quality is 1 / numElements alternateMin = 1f / (float)numElements; } if (minWorstCaseQuality > alternateMin) { minWorstCaseQuality = alternateMin; } // System.out.println("WC profit for " + pDerivative.getName() + " is " + (minWorstCaseQuality - derivativePrice)); // Worst case profit return minWorstCaseQuality - derivativePrice; } public float getWorstCaseQuality(int relationNumber) { // First bit or last bit is set => quality 1 if (isBitSet(relationNumber, 0) || isBitSet(relationNumber, 7)) { return 1f; } // Find number of bits 1, 2, 4 set int s1 = getBit(relationNumber, 1) + getBit(relationNumber, 2) + getBit(relationNumber, 4); // Find number of bits 3, 5, 6 set int s2 = getBit(relationNumber, 3) + getBit(relationNumber, 5) + getBit(relationNumber, 6); // Lookup quality from table return worstCaseQualityTable[s1][s2]; } private boolean isBitSet(int n, int b) { return (getBit(n, b) == 1); } private int getBit(int n, int b) { return (n / (int)Math.pow(2, b)) % 2; } // TESTING ONLY public static void main(String[] args) throws Exception { BuyingAgent b = new BuyingAgent(); System.out.println(b.getWorstCaseQuality(1)); System.out.println(b.getWorstCaseQuality(128)); System.out.println(b.getWorstCaseQuality(201)); System.out.println(b.getWorstCaseQuality(11)); System.out.println(b.getWorstCaseQuality(2)); System.out.println(b.getWorstCaseQuality(16)); System.out.println(b.getWorstCaseQuality(52)); System.out.println(b.getWorstCaseQuality(64)); System.out.println(b.getWorstCaseQuality(6)); System.out.println(b.getWorstCaseQuality(22)); System.out.println(b.getWorstCaseQuality(54)); //System.out.println(soln.generateXML()); //System.out.println("Quality: " + soln.getQuality().getValue()); } }