CGA Interval Classifier

Ported from a standalone JS/Canvas prototype into real PatLang, compiled to WASM and run live below — see the Paradigms Guide for the numeric tower this interval arithmetic builds on, and the k-blade page for the broader geometric-algebra-as-representation idea this demo's dimensionality reduction is one small example of.

A CGA point embeds a 2D location plus an uncertainty radius as an INTERVAL-valued null vector; a CGA sphere is the same components as plain scalars. Their inner product is therefore an interval, not a single number -- a pixel is only certified inside or outside when zero falls strictly outside that interval; when the interval straddles zero, the classifier honestly reports it ambiguous rather than rounding arbitrarily. Every embedded point is also checked against the Minkowski null-cone identity X² = 0, certifying the embedding itself, not just the classification built on it.

The dataset lives in a synthetic 5D sparse space and is projected down to the 2D plane the classifier sees via a structural k-blade (projected = sum(component × blade)). Toggle Dimensionality Projection to compare a deliberate blade-guided projection (which cancels most of the hidden dimension's cross-plane noise) against naively summing raw components (which lets that noise bleed straight into the visible plane) -- the same k-blade-instead-of-scalar-tensor idea explored on the k-blade page.

PatLang source
# Validated interval Conformal Geometric Algebra (CGA) point-in-sphere
# classifier, with k-blade dimensionality reduction of a sparse 5D
# dataset down to the 2D plane the classifier actually operates on.
#
# A CGA point embeds a 2D location (x, y) plus an uncertainty radius r as
# an INTERVAL-valued null vector: e1/e2 carry [x-r, x+r]/[y-r, y+r], and
# eInf/eO carry the interval bounds of the point's squared norm (the
# conformal embedding that makes "inside/outside a sphere" a single inner
# product). A CGA sphere is the same 4 components as plain scalars. The
# inner product of an interval point against a scalar sphere yields an
# INTERVAL, not a single number -- classification is only certain when
# zero is NOT inside that interval (strictly inside or strictly outside);
# when the interval straddles zero, the pixel is honestly reported
# ambiguous rather than arbitrarily rounded one way.
#
# Every valid CGA point must satisfy the Minkowski null-cone identity
# X^2 = 0 exactly; verify_minkowski checks that 0 is provably trapped
# inside the interval-arithmetic worst-case bounds of X^2 for an embedded
# point, certifying the embedding itself is correct, not just plausible.
#
# The dataset is generated in a synthetic 5D sparse space (d1..d5, only
# d1/d2/d3 ever populated) and projected down to the 2D plane via a
# structural k-blade: projected_x = sum(component * blade.x), projected_y
# = sum(component * blade.y). Toggling reduction on/off shows the
# difference between a deliberate blade-guided projection (which cancels
# most of d3's cross-plane noise) and naively summing raw components
# (which lets that noise bleed straight into the visible plane).
#
# All randomness uses a small seeded LCG (PatLang has no RNG host
# function) so the SAME seed always reproduces the SAME dataset --
# argv carries the seed explicitly, so re-classifying with a new epsilon/
# sphere/projection mode (same seed) never jitters the point layout, only
# a genuinely "new" dataset request passes a new seed.

make a function called rand_seed takes seed returns done
  let s = seed % 2147483647
  let mut s2 = s
  if s <= 0 then
    s2 = 1
  end
  set_var("cga_rand", s2)
  return true
end

make a function called rand_next returns r
  let s = to_num(get("__vars", "cga_rand"))
  let s2 = (s * 48271) % 2147483647
  set_var("cga_rand", s2)
  return s2
end

# A pseudo-random float in [-1, 1].
make a function called rand_signed returns r
  let n = rand_next()
  let frac = (n % 20000) / 10000
  return frac - 1
end

# ---- interval-valued CGA point / scalar sphere -----------------------
# Interval point: [e1_lo, e1_hi, e2_lo, e2_hi, eInf_lo, eInf_hi, eO_lo, eO_hi]
# Scalar sphere:  [e1, e2, eInf, eO]

make a function called cga_embed takes x, y, r returns pt
  let norm2 = x * x + y * y
  let dist = sqrt(norm2)
  let norm2_lo = max(0, norm2 - 2 * r * dist + r * r)
  let norm2_hi = norm2 + 2 * r * dist + r * r
  return [x - r, x + r, y - r, y + r, 0.5 * norm2_lo, 0.5 * norm2_hi, 1.0, 1.0]
end

make a function called cga_create_sphere takes cx, cy, radius returns sph
  let norm2 = cx * cx + cy * cy
  return [cx, cy, 0.5 * (norm2 - radius * radius), 1.0]
end

# Returns [lo, hi] of the inner product X . S (interval point . scalar sphere).
make a function called cga_inner_point_sphere takes pt, sph returns bounds
  let e1_lo = pt[0]
  let e1_hi = pt[1]
  let e2_lo = pt[2]
  let e2_hi = pt[3]
  let eInf_lo = pt[4]
  let eInf_hi = pt[5]
  let eO_lo = pt[6]
  let sph_e1 = sph[0]
  let sph_e2 = sph[1]
  let sph_eInf = sph[2]
  let sph_eO = sph[3]
  let t1a = e1_lo * sph_e1
  let t1b = e1_hi * sph_e1
  let term1_lo = min(t1a, t1b)
  let term1_hi = max(t1a, t1b)
  let t2a = e2_lo * sph_e2
  let t2b = e2_hi * sph_e2
  let term2_lo = min(t2a, t2b)
  let term2_hi = max(t2a, t2b)
  let cross_lo = eInf_lo * sph_eO + eO_lo * sph_eInf
  let cross_hi = eInf_hi * sph_eO + eO_lo * sph_eInf
  return [term1_lo + term2_lo - cross_hi, term1_hi + term2_hi - cross_lo]
end

# Returns [is_zero_trapped (1/0), lo, hi] for X^2 of an interval point.
make a function called cga_verify_minkowski takes pt returns result
  let e1_lo = pt[0]
  let e1_hi = pt[1]
  let e2_lo = pt[2]
  let e2_hi = pt[3]
  let eInf_lo = pt[4]
  let eInf_hi = pt[5]
  let eO_lo = pt[6]
  let eO_hi = pt[7]
  let x1a = e1_lo * e1_lo
  let x1b = e1_hi * e1_hi
  let x1_sq_lo = min(x1a, x1b)
  let x1_sq_hi = max(x1a, x1b)
  let x2a = e2_lo * e2_lo
  let x2b = e2_hi * e2_hi
  let x2_sq_lo = min(x2a, x2b)
  let x2_sq_hi = max(x2a, x2b)
  let cross_lo = 2 * (eInf_lo * eO_lo)
  let cross_hi = 2 * (eInf_hi * eO_hi)
  let x_sq_lo = (x1_sq_lo + x2_sq_lo) - cross_hi
  let x_sq_hi = (x1_sq_hi + x2_sq_hi) - cross_lo
  let mut trapped = 0
  if (x_sq_lo <= 0.00001) and (x_sq_hi >= 0 - 0.00001) then
    trapped = 1
  end
  return [trapped, x_sq_lo, x_sq_hi]
end

# 0 = inside, 1 = outside, 2 = ambiguous (zero is inside the inner-product interval).
# This PseudoCGA embedding's sign convention makes the point-sphere inner
# product POSITIVE when inside the sphere and NEGATIVE when outside (the
# opposite of the "standard" CGA convention some references use) -- what
# matters for a valid classifier is that it's monotonic and consistent,
# verified directly: a point at the sphere's own center gives a strictly
# positive interval, a point far outside gives a strictly negative one.
make a function called classify_pixel takes x, y, epsilon, sph returns status
  let pt = cga_embed(x, y, epsilon)
  let bounds = cga_inner_point_sphere(pt, sph)
  let lo = bounds[0]
  let hi = bounds[1]
  if lo > 0 then
    return 0
  else
    if hi < 0 then
      return 1
    else
      return 2
    end
  end
end

# Hierarchical tree of joins & bisection field: a second, structurally
# different classifier -- instead of one algebraic inner product against a
# single sphere, this walks a subsample of the projected point cloud
# (every 3rd point, matching the "join" -- each point contributes a
# nearest-neighbour vote rather than a single global surface) and
# classifies a pixel by whichever label's nearest point is closer. The
# gap between the two candidate distances stands in for the sphere's
# uncertainty radius: a pixel sitting roughly equidistant from both
# labels' nearest points is exactly the "bisection" boundary, reported
# ambiguous the same honest way the CGA sphere classifier reports zero
# trapped inside its inner-product interval.
make a function called bisection_classify_pixel takes x, y, epsilon, proj_points, n returns status
  let mut min_dist_a = 999999999
  let mut min_dist_b = 999999999
  let mut i = 0
  while i < n do
    let p = proj_points[i]
    let dx = p[0] - x
    let dy = p[1] - y
    let d = sqrt(dx * dx + dy * dy)
    if p[2] == 0 then
      min_dist_a = min(min_dist_a, d)
    else
      min_dist_b = min(min_dist_b, d)
    end
    i = i + 3
  end
  if abs(min_dist_a - min_dist_b) < epsilon then
    return 2
  else
    if min_dist_a < min_dist_b then
      return 0
    else
      return 1
    end
  end
end

# ---- sparse 5D dataset + k-blade dimensionality reduction -------------

make a function called project_point takes d1, d2, d3, use_reduction returns xy
  if use_reduction then
    let px = d1 * 1.0 + d2 * 0.0 + d3 * 0.1
    let py = d1 * 0.0 + d2 * 1.0 + d3 * (0 - 0.1)
    return [px, py]
  else
    return [d1 + d3, d2 + d3]
  end
end

make a function called add_cluster takes points, base_d1, base_d2, base_d3, label, count, jitter returns points2
  let mut i = 0
  while i < count do
    let d1 = base_d1 + rand_signed() * jitter
    let d2 = base_d2 + rand_signed() * jitter
    let d3 = base_d3 + rand_signed() * (jitter + 3)
    let points = list_push(points, [d1, d2, d3, label])
    i = i + 1
  end
  return points
end

make a function called build_dataset takes name returns points
  let mut points = []
  if name == "xor" then
    points = add_cluster(points, 130, 130, 65, 0, 15, 6)
    points = add_cluster(points, 370, 370, 0 - 65, 0, 15, 6)
    points = add_cluster(points, 130, 370, 0 - 65, 1, 15, 6)
    points = add_cluster(points, 370, 130, 65, 1, 15, 6)
  else
    if name == "circles" then
      let mut i = 0
      while i < 60 do
        let a = (to_num(i) / 60) * 6.2831853
        points = add_cluster(points, 250 + cos(a) * 75, 250 + sin(a) * 75, 45, 0, 1, 3)
        points = add_cluster(points, 250 + cos(a) * 190, 250 + sin(a) * 190, 0 - 45, 1, 1, 3)
        i = i + 1
      end
    else
      let mut i = 0
      while i < 90 do
        let theta = (to_num(i) / 90) * 10.9955743
        let r = 15 + (to_num(i) / 90) * 200
        points = add_cluster(points, 250 + cos(theta) * r, 250 + sin(theta) * r, 40, 0, 1, 3)
        points = add_cluster(points, 250 + cos(theta + 3.14159265) * r, 250 + sin(theta + 3.14159265) * r, 0 - 40, 1, 1, 3)
        i = i + 1
      end
    end
  end
  return points
end

# ---- main: generate, project, classify, render -------------------------

make a function called run_classifier takes unused returns done
  let args = argv()
  let dataset = args[0]
  let use_reduction = args[1] == "reduced"
  let epsilon = to_num(args[2])
  let sphere_x = to_num(args[3])
  let sphere_y = to_num(args[4])
  let sphere_r = to_num(args[5])
  let seed = to_num(args[6])
  let classifier = args[7]
  let use_bisection = classifier == "bisection_field"

  rand_seed(seed)
  let raw_points = build_dataset(dataset)
  let sph = cga_create_sphere(sphere_x, sphere_y, sphere_r)

  let n = to_num(list_len(raw_points))
  let mut proj_points = []
  let mut i = 0
  while i < n do
    let p = raw_points[i]
    let xy = project_point(p[0], p[1], p[2], use_reduction)
    proj_points = list_push(proj_points, [xy[0], xy[1], p[3]])
    i = i + 1
  end

  print("GRID")
  let step = 4
  let mut gy = 0
  while gy < 500 do
    let line = sb_new()
    let mut gx = 0
    while gx < 500 do
      let mut status = 0
      if use_bisection then
        status = bisection_classify_pixel(gx, gy, epsilon, proj_points, n)
      else
        status = classify_pixel(gx, gy, epsilon, sph)
      end
      sb_push(line, "" + status)
      gx = gx + step
    end
    print(sb_str(line))
    gy = gy + step
  end

  print("POINTS")
  let mut i2 = 0
  while i2 < n do
    let pp = proj_points[i2]
    print(pp[0] + "," + pp[1] + "," + pp[2])
    i2 = i2 + 1
  end

  print("INVARIANT")
  let sample_pt = cga_embed(252, 252, epsilon)
  let check = cga_verify_minkowski(sample_pt)
  print(check[0] + "," + check[1] + "," + check[2])

  return true
end

run_classifier(0)

Interpreted run on the build machine (pat --ir-run, dataset=xor):

GRID
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111122222222222222222211111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111112222222222222222222222222221111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111112222222222222222222222222222222222111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111112222222222222222222222222222222222222221111111111111111111111111111111111111111
11111111111111111111111111111111111111111111222222222222222222222222222222222222222222221111111111111111111111111111111111111
11111111111111111111111111111111111111111122222222222222222222222222222222222222222222222211111111111111111111111111111111111
11111111111111111111111111111111111111112222222222222222222222222222222222222222222222222222111111111111111111111111111111111
11111111111111111111111111111111111111222222222222222222222222222222222222222222222222222222211111111111111111111111111111111
11111111111111111111111111111111111112222222222222222222222222222222222222222222222222222222222111111111111111111111111111111
11111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222221111111111111111111111111111
11111111111111111111111111111111112222222222222222222222222222222222222222222222222222222222222222111111111111111111111111111
11111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222211111111111111111111111111
11111111111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222221111111111111111111111111
11111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222111111111111111111111111
11111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111111111
11111111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111111
11111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111111
11111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111111
11111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111111
11111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111
11111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111
11111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111
11111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111
11111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111
11111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111
11111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111
11111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111
11111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111
11111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111
11111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111
11111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111
11111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111
11111111111111112222222222222222222222222222222222222222200000002222222222222222222222222222222222222222222222222221111111111
11111111111111122222222222222222222222222222222222222200000000000002222222222222222222222222222222222222222222222221111111111
11111111111111122222222222222222222222222222222222220000000000000000022222222222222222222222222222222222222222222222111111111
11111111111111222222222222222222222222222222222222000000000000000000000222222222222222222222222222222222222222222222111111111
11111111111111222222222222222222222222222222222220000000000000000000000022222222222222222222222222222222222222222222111111111
11111111111111222222222222222222222222222222222200000000000000000000000002222222222222222222222222222222222222222222211111111
11111111111112222222222222222222222222222222222000000000000000000000000000222222222222222222222222222222222222222222211111111
11111111111112222222222222222222222222222222220000000000000000000000000000022222222222222222222222222222222222222222211111111
11111111111112222222222222222222222222222222220000000000000000000000000000002222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222200000000000000000000000000000002222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222200000000000000000000000000000000222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222000000000000000000000000000000000222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222000000000000000000000000000000000022222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000002222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000002222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000002222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000002222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222220000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222000000000000000000000000000000000022222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222200000000000000000000000000000000222222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222200000000000000000000000000000000222222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222220000000000000000000000000000000222222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222220000000000000000000000000000002222222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222222000000000000000000000000000022222222222222222222222222222222222222222222111111
11111111111222222222222222222222222222222222222200000000000000000000000000222222222222222222222222222222222222222222221111111
11111111111222222222222222222222222222222222222220000000000000000000000000222222222222222222222222222222222222222222221111111
11111111111222222222222222222222222222222222222222000000000000000000000022222222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222222222200000000000000000000222222222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222222222222000000000000000002222222222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222222222222220000000000002222222222222222222222222222222222222222222222222221111111
11111111111122222222222222222222222222222222222222222222222000022222222222222222222222222222222222222222222222222222211111111
11111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111
11111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111
11111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111
11111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111
11111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111
11111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111
11111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111
11111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111
11111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111
11111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111
11111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111
11111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111
11111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111
11111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111
11111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111
11111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111
11111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111
11111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111
11111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111
11111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111
11111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111111
11111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111111
11111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111111
11111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222222222222222111111111111111111111
11111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222222222221111111111111111111111
11111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222222222211111111111111111111111
11111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222222222221111111111111111111111111
11111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222222222211111111111111111111111111
11111111111111111111111111111112222222222222222222222222222222222222222222222222222222222222222222111111111111111111111111111
11111111111111111111111111111111222222222222222222222222222222222222222222222222222222222222222221111111111111111111111111111
11111111111111111111111111111111112222222222222222222222222222222222222222222222222222222222222111111111111111111111111111111
11111111111111111111111111111111111222222222222222222222222222222222222222222222222222222222221111111111111111111111111111111
11111111111111111111111111111111111112222222222222222222222222222222222222222222222222222222111111111111111111111111111111111
11111111111111111111111111111111111111222222222222222222222222222222222222222222222222222211111111111111111111111111111111111
11111111111111111111111111111111111111112222222222222222222222222222222222222222222222221111111111111111111111111111111111111
11111111111111111111111111111111111111111112222222222222222222222222222222222222222222111111111111111111111111111111111111111
11111111111111111111111111111111111111111111122222222222222222222222222222222222222211111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111122222222222222222222222222222222211111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111122222222222222222222222222211111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111222222222222222211111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
POINTS
135.90234,120.53666,0
131.39367,122.41313,0
131.49878999999999,127.70080999999999,0
130.83723,119.08397000000001,0
136.28037,123.65723,0
138.90485999999999,127.87993999999999,0
134.50728,119.44352,0
140.27883,127.98017,0
137.3319,126.7271,0
139.33923,125.25376999999999,0
134.80863000000002,119.35037,0
132.89943,128.91857000000002,0
141.97803,128.11217000000002,0
135.74658000000002,128.43362,0
131.21988,122.90252000000001,0
366.94292,377.80548,0
366.91613,372.67647,0
365.03051,373.86609000000004,0
369.26756,377.85984,0
364.49993,372.48447,0
358.42535,371.48445000000004,0
358.73609,373.09611,0
363.53729000000004,374.81690999999995,0
357.67796,372.38124,0
362.61293,373.20927,0
360.12464,379.56036,0
366.40541,377.71119,0
366.4973,381.8085,0
365.89457,376.55583,0
363.59797999999995,371.14182000000005,0
122.31908000000001,380.20872,1
126.45209,379.47831,1
126.07172,375.79848,1
120.61007,373.39353,1
121.47161,374.75559,1
124.82230999999999,380.84649,1
123.97805000000001,375.69374999999997,1
117.78743,376.64817,1
117.34283,372.51897,1
121.18991,379.98909,1
120.89252,379.82508,1
119.35195999999999,379.70904,1
121.06136,370.34604,1
124.93912999999999,381.22887,1
126.70736,377.33844,1
379.65252000000004,127.00268000000001,1
371.51475,117.44645,1
373.14678000000004,122.96882,1
370.2885,119.69630000000001,1
379.8603,120.6695,1
376.27961999999997,127.15478,1
377.88696,120.78224,1
381.54417,119.65943,1
376.82535,118.51505,1
372.90003,122.24236999999998,1
371.81403,128.54177,1
381.40491,126.10289,1
370.53999,127.18301,1
377.46903,124.73237000000002,1
373.16949,129.38891,1
INVARIANT
1,-20505.163625232468,20793.163625232482
true

Dataset (5D sparse space)

Dimensionality projection

Classifier engine

Uncertainty radius ε: 12px

Minkowski invariant (X² = 0)

starting...

Click the grid to move the sphere. class A   class B