@Override
  public Tuple2<String, Instance> call(Tuple2<String, Instance> inst) throws Exception {
    Instance bestCluster = null;
    double bestScore = Double.MAX_VALUE;

    for (String clusterId : clusters.keySet()) {
      Instance cluster = clusters.get(clusterId);
      double d = distFunc.distance(inst._2, cluster);

      if (d < bestScore && d < threshold) {
        bestScore = d;
        bestCluster = cluster;
      }
    }
    // System.out.println(inst._1 + " -> " + bestCluster);
    if (bestCluster == null) {
      return null;
    }

    return new Tuple2<String, Instance>(bestCluster.getId(), inst._2);
  }
示例#2
0
    /**
     * Not 'pure' Worley, but the results are virtually the same. Returns distances in da and point
     * coords in pa
     */
    public static void voronoi(
        float x,
        float y,
        float z,
        float[] da,
        float[] pa,
        float distanceExponent,
        int distanceType) {
      float xd, yd, zd, d, p[] = new float[3];

      DistanceFunction distanceFunc = distanceFunctions.get(Integer.valueOf(distanceType));
      if (distanceFunc == null) {
        distanceFunc = distanceFunctions.get(Integer.valueOf(0));
      }

      int xi = (int) FastMath.floor(x);
      int yi = (int) FastMath.floor(y);
      int zi = (int) FastMath.floor(z);
      da[0] = da[1] = da[2] = da[3] = Float.MAX_VALUE; // 1e10f;
      for (int i = xi - 1; i <= xi + 1; ++i) {
        for (int j = yi - 1; j <= yi + 1; ++j) {
          for (int k = zi - 1; k <= zi + 1; ++k) {
            NoiseMath.hash(i, j, k, p);
            xd = x - (p[0] + i);
            yd = y - (p[1] + j);
            zd = z - (p[2] + k);
            d = distanceFunc.execute(xd, yd, zd, distanceExponent);
            if (d < da[0]) {
              da[3] = da[2];
              da[2] = da[1];
              da[1] = da[0];
              da[0] = d;
              pa[9] = pa[6];
              pa[10] = pa[7];
              pa[11] = pa[8];
              pa[6] = pa[3];
              pa[7] = pa[4];
              pa[8] = pa[5];
              pa[3] = pa[0];
              pa[4] = pa[1];
              pa[5] = pa[2];
              pa[0] = p[0] + i;
              pa[1] = p[1] + j;
              pa[2] = p[2] + k;
            } else if (d < da[1]) {
              da[3] = da[2];
              da[2] = da[1];
              da[1] = d;
              pa[9] = pa[6];
              pa[10] = pa[7];
              pa[11] = pa[8];
              pa[6] = pa[3];
              pa[7] = pa[4];
              pa[8] = pa[5];
              pa[3] = p[0] + i;
              pa[4] = p[1] + j;
              pa[5] = p[2] + k;
            } else if (d < da[2]) {
              da[3] = da[2];
              da[2] = d;
              pa[9] = pa[6];
              pa[10] = pa[7];
              pa[11] = pa[8];
              pa[6] = p[0] + i;
              pa[7] = p[1] + j;
              pa[8] = p[2] + k;
            } else if (d < da[3]) {
              da[3] = d;
              pa[9] = p[0] + i;
              pa[10] = p[1] + j;
              pa[11] = p[2] + k;
            }
          }
        }
      }
    }