private void adjustDateLineCrossingPoints() { ArrayList<LatLon> corners = new ArrayList<LatLon>(Arrays.asList(sw, se, nw, ne)); if (!LatLon.locationsCrossDateLine(corners)) return; double lonSign = 0; for (LatLon corner : corners) { if (Math.abs(corner.getLongitude().degrees) != 180) lonSign = Math.signum(corner.getLongitude().degrees); } if (lonSign == 0) return; if (Math.abs(sw.getLongitude().degrees) == 180 && Math.signum(sw.getLongitude().degrees) != lonSign) sw = new Position(sw.getLatitude(), sw.getLongitude().multiply(-1), sw.getElevation()); if (Math.abs(se.getLongitude().degrees) == 180 && Math.signum(se.getLongitude().degrees) != lonSign) se = new Position(se.getLatitude(), se.getLongitude().multiply(-1), se.getElevation()); if (Math.abs(nw.getLongitude().degrees) == 180 && Math.signum(nw.getLongitude().degrees) != lonSign) nw = new Position(nw.getLatitude(), nw.getLongitude().multiply(-1), nw.getElevation()); if (Math.abs(ne.getLongitude().degrees) == 180 && Math.signum(ne.getLongitude().degrees) != lonSign) ne = new Position(ne.getLatitude(), ne.getLongitude().multiply(-1), ne.getElevation()); }
public static Sector[] splitBoundingSectors(Iterable<? extends LatLon> locations) { if (locations == null) { throw new IllegalArgumentException("Location In List Is Null"); } if (!locations.iterator().hasNext()) { return null; } double minLat = Angle.POS90.getDegrees(); double minLon = Angle.POS180.getDegrees(); double maxLat = Angle.NEG90.getDegrees(); double maxLon = Angle.NEG180.getDegrees(); LatLon lastLocation = null; for (LatLon ll : locations) { double lat = ll.getLatitude().getDegrees(); if (lat < minLat) { minLat = lat; } if (lat > maxLat) { maxLat = lat; } double lon = ll.getLongitude().getDegrees(); if (lon >= 0 && lon < minLon) { minLon = lon; } if (lon <= 0 && lon > maxLon) { maxLon = lon; } if (lastLocation != null) { double lastLon = lastLocation.getLongitude().getDegrees(); if (Math.signum(lon) != Math.signum(lastLon)) { if (Math.abs(lon - lastLon) < 180) { // Crossing the zero longitude line too maxLon = 0; minLon = 0; } } } lastLocation = ll; } if (minLat == maxLat && minLon == maxLon) { return null; } return new Sector[] { Sector.fromDegrees(minLat, maxLat, minLon, 180), // Sector on eastern hemisphere. Sector.fromDegrees(minLat, maxLat, -180, maxLon) // Sector on western hemisphere. }; }
private final void computeArea() { // The area of a quadrilateral is 0.5*p*q*sin(theta) // Where p and q are the length of the 2 diagonals and theta is the angle between them // If we rotate P in the right direction, then area = 0.5*p*q*cos(theta) where theta is // the angle between Q and the rotated P, but this is simply 0.5 * dot product of P' and Q // Note, it is possible because of the cos to get a negative area, when this happens, it means // that the quadrilateral has flipped and that the normally inward pointing normals are // now pointing outward, so if we get a negative area, we should flip the force vectors... Vector2D P = tv.getPosition().subtract(d.getPosition()); Vector2D Q = dt.getPosition().subtract(v.getPosition()); area = 0.5 * P.rotate90().dot(Q); if (Math.signum(area) != Math.signum(desiredArea) && desiredArea != 0) { System.err.println( "Compartment:" + this.toString() + " has flipped inside out. Area:" + area); } }
public void update() { // See Compute Area for reason of the absolute value and signum of area... double pressureForce = Constants.get().getPressure() * (Math.abs(area) - Math.abs(desiredArea)); pressureForce = Math.signum(area) * Math.signum(pressureForce) * Math.sqrt(Math.abs(pressureForce)); // The pressure is applied on every segment proportionally to its area. for (int i = 0, n = nodeList.size(); i < n; i++) { Node prevNode = nodeList.get(i); Node curNode = nodeList.get((i + 1) % n); Node nextNode = nodeList.get((i + 2) % n); Vector2D prevVector = curNode.getPosition().subtract(prevNode.getPosition()).rotate270(); Vector2D nextVector = nextNode.getPosition().subtract(curNode.getPosition()).rotate270(); forces.put(curNode, prevVector.scale(pressureForce).add(nextVector.scale(pressureForce))); } }
/** * convenience API to add a curved section to the design * * @param radius: the bending radius of the section * @param eighths: the angle in multiples of 45 deg * @return the resulting track design */ public TrackDesign curve(double radius, int eighths) { // reasoning: with quarters only, boxing the track becomes a matter of boxing the anchors for (int i = 0; i < Math.abs(eighths); i++) { Anchor previous = getLastAnchor(); TrackSection section = new Curve(radius, (int) (Math.signum(eighths)), previous); sections.add(section); } return this; }
public void addPerLengthNumericProximity( Counter<String> features, final NumericMentionExpression e) { List<NumericTuple> args = e.expression.arguments(); { double multiplier = e.mention_normalized_value / args.get(0).val; features.incrementCount("abs-numeric-distance-1", Math.abs(Math.log(multiplier))); features.incrementCount("sign-numeric-distance-1", Math.signum(Math.log(multiplier))); } if (args.size() > 1) { double multiplier = e.mention_normalized_value / args.get(1).val; features.incrementCount("abs-numeric-distance-2", Math.abs(Math.log(multiplier))); features.incrementCount("sign-numeric-distance-2", Math.signum(Math.log(multiplier))); } if (args.size() > 2) { double multiplier = e.mention_normalized_value / args.get(2).val; features.incrementCount("abs-numeric-distance-3", Math.abs(Math.log(multiplier))); features.incrementCount("sign-numeric-distance-3", Math.signum(Math.log(multiplier))); } }
private Point teleport(Point location, double offset, Map<Integer, Point> id_lut) { Point self = id_lut.get(self_id); double x = Math.max(Math.min(location.x, 20), 0); double y = Math.max(Math.min(location.y, 20), 0); double dx = x - self.x; double dy = y - self.y; double r = Math.hypot(dx, dy) - offset; if (Math.abs(r) > 6) { r = Math.signum(r) * 6; } double th = Math.atan2(dy, dx); return new Point(r * Math.cos(th), r * Math.sin(th), self_id); }
/** * Compute the (inward) normal at each node by averaging the unit direction vectors of the two * edges connected to it. */ private void computeNormals() { for (int i = 0, n = nodeList.size(); i < n; i++) { Node prevNode = nodeList.get(i); Node curNode = nodeList.get((i + 1) % n); Node nextNode = nodeList.get((i + 2) % n); Vector2D prevEdge = curNode.getPosition().subtract(prevNode.getPosition()); Vector2D nextEdge = nextNode.getPosition().subtract(curNode.getPosition()); double crossProd = prevEdge.crossMag(nextEdge); Vector2D normal = prevEdge.normalize().subtract(nextEdge.normalize()).scaleTo(Math.signum(crossProd)); normals.put(curNode, normal); } }
@SuppressWarnings({"UnnecessaryLocalVariable"}) public double[] getBilinearCoords(double alpha, double beta) { // TODO: this method isn't always finding the correct -- or any -- roots double eps = 1e-9; double u, v; double alpha11 = this.w11[1]; double beta11 = this.w11[2]; if (Math.abs(alpha11 - 1) < eps) // if alpha11 == 1 { u = alpha; if (Math.abs(beta11 - 1) < eps) // if beta == 1 v = beta; else v = beta / (u * (beta11 - 1) + 1); } else if (Math.abs(beta11 - 1) < eps) // if beta = 1 { v = beta; u = alpha / (v * (alpha11 - 1) + 1); } else { double a = 1d - beta11; double b = alpha * (beta11 - 1) - beta * (alpha11 - 1) - 1; double c = alpha; double b24ac = b * b - 4 * a * c; if (a == 0 || b24ac < 0) return new double[] {-1, -1}; // TODO: Warn. double q = -0.5 * (b + (b != 0 ? Math.signum(b) : 1) * Math.sqrt(b24ac)); u = q / a; double ualt = c / q; u = Math.abs(u) <= Math.abs(ualt) ? u : ualt; if (u < 0 || u > 1) u = c / q; v = u * (beta11 - 1) + 1; v = Math.abs(v) >= eps ? beta / v : -1; } return new double[] {u, v}; }
@Override public int compareTo(X that) { // TODO Auto-generated method stub if (this.b == that.b) return this.a - that.a; return (int) Math.signum(that.b - this.b); }
public int compare(ScoreDoc o1, ScoreDoc o2) { return (int) Math.signum(o2.score - o1.score); }
/** * See how far we have gone in which direction since last going the other direction. * * @return The (signed) distance. */ public int getCurrentDistance() { return m_distanceThisDirection * (int) Math.signum(m_lastStep); }
// To add/remove functions change evaluateOperator() and registration public double evaluateFunction(String fncnam, ArgParser fncargs) throws ArithmeticException { switch (Character.toLowerCase(fncnam.charAt(0))) { case 'a': { if (fncnam.equalsIgnoreCase("abs")) { return Math.abs(fncargs.next()); } if (fncnam.equalsIgnoreCase("acos")) { return Math.acos(fncargs.next()); } if (fncnam.equalsIgnoreCase("asin")) { return Math.asin(fncargs.next()); } if (fncnam.equalsIgnoreCase("atan")) { return Math.atan(fncargs.next()); } } break; case 'c': { if (fncnam.equalsIgnoreCase("cbrt")) { return Math.cbrt(fncargs.next()); } if (fncnam.equalsIgnoreCase("ceil")) { return Math.ceil(fncargs.next()); } if (fncnam.equalsIgnoreCase("cos")) { return Math.cos(fncargs.next()); } if (fncnam.equalsIgnoreCase("cosh")) { return Math.cosh(fncargs.next()); } } break; case 'e': { if (fncnam.equalsIgnoreCase("exp")) { return Math.exp(fncargs.next()); } if (fncnam.equalsIgnoreCase("expm1")) { return Math.expm1(fncargs.next()); } } break; case 'f': { if (fncnam.equalsIgnoreCase("floor")) { return Math.floor(fncargs.next()); } } break; case 'g': { // if(fncnam.equalsIgnoreCase("getExponent" )) { return // Math.getExponent(fncargs.next()); } needs Java 6 } break; case 'l': { if (fncnam.equalsIgnoreCase("log")) { return Math.log(fncargs.next()); } if (fncnam.equalsIgnoreCase("log10")) { return Math.log10(fncargs.next()); } if (fncnam.equalsIgnoreCase("log1p")) { return Math.log1p(fncargs.next()); } } break; case 'm': { if (fncnam.equalsIgnoreCase("max")) { return Math.max(fncargs.next(), fncargs.next()); } if (fncnam.equalsIgnoreCase("min")) { return Math.min(fncargs.next(), fncargs.next()); } } break; case 'n': { // if(fncnam.equalsIgnoreCase("nextUp" )) { return Math.nextUp // (fncargs.next()); } needs Java 6 } break; case 'r': { if (fncnam.equalsIgnoreCase("random")) { return Math.random(); } // impure if (fncnam.equalsIgnoreCase("round")) { return Math.round(fncargs.next()); } if (fncnam.equalsIgnoreCase("roundHE")) { return Math.rint(fncargs.next()); } // round half-even } break; case 's': { if (fncnam.equalsIgnoreCase("signum")) { return Math.signum(fncargs.next()); } if (fncnam.equalsIgnoreCase("sin")) { return Math.sin(fncargs.next()); } if (fncnam.equalsIgnoreCase("sinh")) { return Math.sinh(fncargs.next()); } if (fncnam.equalsIgnoreCase("sqrt")) { return Math.sqrt(fncargs.next()); } } break; case 't': { if (fncnam.equalsIgnoreCase("tan")) { return Math.tan(fncargs.next()); } if (fncnam.equalsIgnoreCase("tanh")) { return Math.tanh(fncargs.next()); } if (fncnam.equalsIgnoreCase("toDegrees")) { return Math.toDegrees(fncargs.next()); } if (fncnam.equalsIgnoreCase("toRadians")) { return Math.toRadians(fncargs.next()); } } break; case 'u': { if (fncnam.equalsIgnoreCase("ulp")) { return Math.ulp(fncargs.next()); } } break; // no default } throw new UnsupportedOperationException( "MathEval internal function setup is incorrect - internal function \"" + fncnam + "\" not handled"); }
private long estimateNj(final long nj, final double q) { // To estimate Nj. // 1. Know that Nj >= nj // 2. Know that Nj <= N (rowCount) long minNj = nj; long maxNj = N; // Binary search our way to a best Nj value. Could do this in // floating point and come within epsilon of the correct value, // but I think we just want to round to the nearest integer. final double _1q = 1.0 - q; final double njTarget = (double) nj; long bestNj = -1; long prevBestNj = -1; double bestNjDelta = Double.MAX_VALUE; do { long Nj = ((maxNj - minNj) / 2) + minNj; // nj = (q * Nj) / (1 - (1 - q)^Nj) double njGuess = compute_nj(q, _1q, (double) Nj); if (njGuess == njTarget) { // Nailed it. return Nj; } double delta = njTarget - njGuess; if (Double.isNaN(delta)) { throw new RuntimeException("Got NaN"); } int sign = (int) Math.signum(delta); delta = Math.abs(delta); if (sign < 0) { // Guess is too high maxNj = Nj; } else if (sign > 0) { // Guess it too low minNj = Nj; } else { // Shouldn't be possible. assert (false); return Nj; } if (delta <= 1.0) { // Very close. if (sign < 0) { if ((Nj - 1) < minNj) { return Nj; } // Make one last attempt at Nj - 1 minNj = Nj - 1; } else { // sign > 0 if ((Nj + 1) > maxNj) { return Nj; } maxNj = Nj + 1; } } if (delta < bestNjDelta) { prevBestNj = bestNj; bestNjDelta = delta; bestNj = Nj; } } while ((maxNj - minNj) > 1); if (bestNj == minNj) { if (prevBestNj == maxNj) { // Just tried maxNj, don't try it again. return bestNj; } // Try maxNj to make sure. // nj = (q * Nj) / (1 - (1 - q)^Nj) double njGuess = compute_nj(q, _1q, (double) maxNj); if (Math.abs(njTarget - njGuess) < bestNjDelta) { return maxNj; } } else if (bestNj == maxNj) { if (prevBestNj == minNj) { // Just tried minNj, don't try it again. return bestNj; } // Try minNj to make sure // Try maxNj to make sure. // nj = (q * Nj) / (1 - (1 - q)^Nj) double njGuess = compute_nj(q, _1q, (double) minNj); if (Math.abs(njTarget - njGuess) < bestNjDelta) { return minNj; } } else { assert (false); } return bestNj; }
public void addObservedResult( double min, double max, double closeVal, long currentTime, String passCode) throws IllegalStateValueDataModificationException { if (!this.passCode.equals(passCode)) { throw new IllegalStateValueDataModificationException(); } int priority = 0; Set<Long> closedOrders = new HashSet<Long>(); for (Map.Entry<Long, OpenOrder> entry : openOrders.entrySet()) { long orderNumber = entry.getKey(); if (orderNumber != currentTime) { OpenOrder order = entry.getValue(); double weight = Math.exp(-priority); Integer timeClass = (int) (Math.log(currentTime - orderNumber) / Math.log(2)); int maxClass = (int) ((max - order.getPrice()) / res); int minClass = (int) ((min - order.getPrice()) / res); if (!dist.containsKey(timeClass)) { dist.put(timeClass, new TreeMap<Integer, Double>()); } for (int i = minClass; i <= maxClass; i++) { if (!dist.get(timeClass).containsKey(i)) { dist.get(timeClass).put(i, 0.0); } if (!collapsedDist.containsKey(i)) { collapsedDist.put(i, 0.0); } } if (minClass != 0 && maxClass != 0) { for (int i = minClass; i <= maxClass; i++) { dist.get(timeClass).put(i, dist.get(timeClass).get(i) + weight); collapsedDist.put(i, collapsedDist.get(i) + weight); } } sumWeights += weight; boolean closed = false; if (!order.isClosed()) { if (order.getPosition() == 'L') { closed = order.newPrice(min); if (Math.random() > 0.5) // (!closed) { closed = order.newPrice(max); } } else { closed = order.newPrice(max); if (Math.random() > 0.5) // (!closed) { closed = order.newPrice(min); } } if (!closed && (currentTime - orderNumber) > maxAge) { order.close(closeVal); closed = true; } if (closed) { double profit = weight * (order.getPnL() / res); // System.out.println("Order Closed from " + state + ": " + orderNumber + ": Profit: " + // profit); pnl += profit; sum = pnl; sum2PnL += (profit * profit); sum2 = sum2PnL; correlator.pnl -= average; countClosed += weight; average = pnl / countClosed; correlator.pnl += average; correlator.stackPnL.addToStack(Math.signum(profit)); double variance = Math.abs(sum2 / countClosed - average); sdev = Math.sqrt(variance); double average2PnL = average * average; sharpe = Math.sqrt(average2PnL / variance); } } if (closed && (currentTime - orderNumber) >= maxAge) { closedOrders.add(orderNumber); } priority++; } } for (long orderNumber : closedOrders) { openOrders.remove(orderNumber); } if (openOrders.isEmpty()) { correlator.removeLiveState(this); } }
public void addNumericProximity(Counter<String> features, final NumericMentionExpression e) { double multiplier = e.mention_normalized_value / e.expression_value; features.incrementCount("numeric-distance", Math.log(multiplier)); features.incrementCount("abs-numeric-distance", Math.abs(Math.log(multiplier))); features.incrementCount("sign-numeric-distance", Math.signum(Math.log(multiplier))); }