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.
| Label | Meaning |
|---|---|
SELF_EXCITED | The 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_CANDIDATE | The 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. |
DIVERGENT | The trajectory values grew too large (escaped to infinity). |
INCONCLUSIVE | The 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 (). 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 ), 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.