Understanding Results

How to interpret BasinLabels, cloud summaries, and JSON outputs.

When you run a workflow in hidden-attractors-fo, the output is typically a JSON summary file. Understanding this file and the concepts behind it is crucial for interpreting your results.

The JSON Summary Structure

A typical output from the Unified Chua workflow looks like this:

{
  "system": "chua_nonsmooth",
  "q": 0.98,
  "dt": 0.01,
  "t_span": [0.0, 200.0],
  "total_seeds": 50,
  "equilibria": {
    "O+": [1.5, 0.0, -1.5],
    "O-": [-1.5, 0.0, 1.5],
    "O0": [0.0, 0.0, 0.0]
  },
  "results": [
    {
      "seed_index": 0,
      "initial_condition": [1.4, 0.1, -1.4],
      "basin_label": "SELF_EXCITED",
      "final_point": [1.5, 0.0, -1.5],
      "trajectory_summary": { ... }
    },
    ...
  ],
  "classification_counts": {
    "SELF_EXCITED": 48,
    "HIDDEN_CANDIDATE": 2,
    "DIVERGENT": 0,
    "INCONCLUSIVE": 0
  }
}

Basin Labels

The core of the analysis is the basin_label assigned to each trajectory. The library uses the BasinLabel enum to classify outcomes based on the final point of the trajectory relative to the system’s equilibria.

LabelMeaning
SELF_EXCITEDThe trajectory converged to an equilibrium point, or its basin of attraction intersects with a small neighborhood of an unstable equilibrium. This is the standard behavior for most chaotic systems (like the classic Lorenz).
HIDDEN_CANDIDATEThe trajectory did not converge to any known equilibrium, and it remained bounded. This is a strong candidate for a hidden attractor or a hidden limit cycle.
DIVERGENTThe trajectory values grew too large (escaped to infinity).
INCONCLUSIVEThe trajectory exhibited numerical instability or NaNs during integration.

Trajectory Cloud Summaries

If a trajectory does not diverge, the workflow computes a cloud_summary to capture its geometric properties in phase space without saving the entire time series (which can be massive).

Inside the trajectory_summary block, you will find:

  • bounding_box: The [min, max] bounds for each dimension (x,y,zx, y, z). Useful for determining the spatial extent of the attractor.
  • centroid: The geometric center of the trajectory cloud.
  • spread: The standard deviation of the points along each axis, giving a measure of the attractor’s “thickness”.

Example Cloud Summary

"trajectory_summary": {
  "bounding_box": [
    [-2.5, 2.5],
    [-0.5, 0.5],
    [-3.0, 3.0]
  ],
  "centroid": [0.0, 0.0, 0.0],
  "spread": [1.2, 0.2, 1.5]
}

Robustness Cases

In advanced workflows like the Robustness Overlay, you might see robustness_cases. This metric measures how close the attractor gets to the equilibria.

If the attractor “touches” or gets extremely close to an equilibrium (closer than a threshold ϵ\epsilon), its status as “hidden” is challenged, as it might just be a self-excited attractor with a very narrow basin connection. The robustness cases report the minimum distance to each equilibrium.