Commit Graph

2098 Commits (a6b8c03e0e08e6d5c79173bedc3137c14caf3d55)

Author SHA1 Message Date
Tyler Goodlet b02a43466f Only update y-range from L1 mxmn when last index in view
We still have to always keep track of the last max and min
though.
2022-04-13 08:11:34 -04:00
Tyler Goodlet 229d269ae4 Drop old `pyqtgraph` downsample code 2022-04-13 08:11:34 -04:00
Tyler Goodlet 6f4216e102 Tweak log-scaler for more detail 2022-04-13 08:11:34 -04:00
Tyler Goodlet fadc7a7b10 Drop `._ic` debugging prints 2022-04-13 08:11:34 -04:00
Tyler Goodlet 985acb30a8 Display loop mega-cleanup
The most important changes include:
- iterating the new `Flow` type and updating graphics
- adding detailed profiling
- increasing the min uppx before graphics updates are throttled
- including the L1 spread in y-range calcs so that you never have the
  bid/ask go "out of view"..
- pass around `Flow`s instead of shms
- drop all the old prototyped downsampling code
2022-04-13 08:11:34 -04:00
Tyler Goodlet 91b4816c88 Allow passing a `plotItem` to `.draw_curve()`
If manually managing an overlay you'll likely call `.overlay_plotitem()`
and then a plotting method so we need to accept a plot item input so
that the chart's pi doesn't get assigned incorrectly in the `Flow` entry
(though it is by default if no input is provided).

More,
- add a `Flow.graphics` field and set it to the `pg.GraphicsObject`.
- make `Flow.maxmin()` return `None` in the "can't calculate" cases.
2022-04-13 08:11:34 -04:00
Tyler Goodlet 6fa00cc2ce Fsp UI initialization updates
- set shm refs on `Flow` entries.
- don't run a graphics cycle on 'update' msgs from the engine
  if the containing chart is hidden.
- drop `volume` from flows map and disable auto-yranging
  once $vlm comes up.
2022-04-13 08:11:34 -04:00
Tyler Goodlet 6f0fba30c8 Disconnect signals in `ChartView.disable_auto_yrange()`
Allows for removing resize callbacks for a flow/overlay that you wish to
remove from view (eg. unit volume after dollar volume is up) and thus
less general interaction callback overhead for any plot you don't wish
to show or resize.

Further,
- drop the `autoscale_linked_plots` block for now since with
  multi-view-box overlays each register their own vb resize slots
- pull the graphics object from the chart's `Flow` map inside
  `.maybe_downsample_graphics()`
2022-04-13 08:11:34 -04:00
Tyler Goodlet 5b7f33f60b Fix bug where if `yrange` was passed the mxmin callback was still used.. 2022-04-13 08:11:34 -04:00
Tyler Goodlet f2a9580d5c Guard against zero px width 2022-04-13 08:11:34 -04:00
Tyler Goodlet 1066d78918 Add `Flow` type with a real chitty mxmn cacheing method
This new type wraps a shm data flow and will eventually include things
like incremental path-graphics updates and serialization + bg downsampling
techniques. The main immediate motivation was to get a cached y-range max/min
calc going since profiling revealed the `numpy` equivalents were
actually quite slow as the data set grows large. Likely we can use all
this to drive a streaming mx/mn routine that's always launched as part
of each on-host flow.

This is our official foray into use of `msgspec.Struct` B) and I have to
say, pretty impressed; we'll likely completely ditch `pydantic` from
here on out.
2022-04-13 08:11:34 -04:00
Tyler Goodlet b3fde388dd Loop for first graphic with xvec 2022-04-13 08:11:34 -04:00
Tyler Goodlet d6b7ba2127 Only `.maybe_downsample_graphics()` on manual changes
We don't need update graphics on every x-range change since that's what
the display loop does. Instead, only on manual changes do we make manual
calls into `.update_graphics_from_array()` and be sure to iterate all
linked subplots and all their embedded graphics.
2022-04-13 08:11:34 -04:00
Tyler Goodlet f367f1a095 Don't return early on ds line render to avoid breaking profiling
The pg profiler seems to have trouble with early `return`s in function
calls (likely muckery with the GC/`.__delete__()`) so let's just try
to avoid it for now until we either fix it (probably by implementing as
a ctx mngr) or use diff one.
2022-04-13 08:11:34 -04:00
Tyler Goodlet 228b2998d0 Use HL tracer by default, seems to be faster? 2022-04-13 08:11:34 -04:00
Tyler Goodlet 1618428eed Allow passing "ms slower then" value on cli to `--profile` 2022-04-13 08:11:34 -04:00
Tyler Goodlet 75d5371a81 Only bail up pan updates if uppx > 16 2022-04-13 08:11:33 -04:00
Tyler Goodlet c15f737f76 Delegate `BarItems.x_uppx()` to internal ds curve 2022-04-13 08:11:33 -04:00
Tyler Goodlet e7ee93f6df Downsample curves even less frequently 2022-04-13 08:11:33 -04:00
Tyler Goodlet a48edb08f3 Only pass vr for bars, allow source vb in autorange 2022-04-13 08:11:33 -04:00
Tyler Goodlet 81f74ea44b Drop the unit-volume chart once $vlm is fully drawn 2022-04-13 08:11:33 -04:00
Tyler Goodlet ebf41281f5 Ensure we update the volume array, not graphics
Ugh, turns out the wacky `ChartView.maxmin` callback stuff we did (for
determining y-range sizings) currently requires that the volume array
has a "bars in view" result.. so let's make that keep working without
rendering the graphics for the curve (since we're disabling them once
$vlm comes up).
2022-04-13 08:11:33 -04:00
Tyler Goodlet f8368e31e2 Add `.update_graphics_from_array()` flags for setting view-range use and graphics rendering 2022-04-13 08:11:33 -04:00
Tyler Goodlet 7746f09c3b Guard against zero px width 2022-04-13 08:11:33 -04:00
Tyler Goodlet dd8443be7b Given in-view rendering, make bars downsample on uppx >= 8 2022-04-13 08:11:33 -04:00
Tyler Goodlet bf14fea9e9 Make `FastAppendCurve` optionally view range aware
As with the `BarItems` graphics, this makes it possible to pass in a "in
view" range of array data that can be *only* rendered improving
performance for large(r) data sets. All the other normal behaviour is
kept (i.e a persistent, (pre/ap)pendable path can still be maintained)
if a ``view_range`` is not provided.

Further updates,
- drop the `.should_ds_or_redraw()` and `.maybe_downsample()` predicates
 instead moving all that logic inside `.update_from_array()`.
- disable the "cache flipping", which doesn't seem to be needed to avoid
  artifacts any more?
- handle all redraw/dowsampling logic in `.update_from_array()`.
- even more profiling.
- drop path `.reserve()` stuff until we better figure out how it's
  supposed to work.
2022-04-13 08:11:33 -04:00
Tyler Goodlet 0e8486a667 Fix view range array to include most recent (facepalm) 2022-04-13 08:11:33 -04:00
Tyler Goodlet fcaa2cf092 TOQUASH: drop display loop old .update_ohlc_.. 2022-04-13 08:11:33 -04:00
Tyler Goodlet 2c4f434ffa Port to new `.update_graphics_from_array()`, pause quote updates on chart interaction 2022-04-13 08:11:33 -04:00
Tyler Goodlet a9c07ab6ab Make panning pause feeds, call into update method from downsampler cb loop 2022-04-13 08:11:33 -04:00
Tyler Goodlet fdbddabba4 Attempt only rendering ohlc bars in view and ds-ing otherwise 2022-04-13 08:11:33 -04:00
Tyler Goodlet f4fabc71c4 Unify into a single update method: `.update_graphics_from_array()` 2022-04-13 08:11:33 -04:00
Tyler Goodlet cda6e2fab4 Establish stream before `fsp_compute` so that backfill updates work again.. 2022-04-13 08:11:33 -04:00
Tyler Goodlet cc2873b09f Remove units vlm cuve once the $vlm one comes up 2022-04-13 08:11:33 -04:00
Tyler Goodlet b6166513c6 Index must be int bro.. 2022-04-13 08:11:33 -04:00
Tyler Goodlet 8344a7ea1a Move px width log scaling into `ds_m4()` 2022-04-13 08:11:33 -04:00
Tyler Goodlet 67aeefb3b6 Add more frequent ds steps when zooming out; use profiler gt 2022-04-13 08:11:33 -04:00
Tyler Goodlet 2db41855e0 Make `BarItems` use our line curve for downsampling
Drop all the logic originally in `.update_ds_line()` which is now done
internal to our `FastAppendCurve`. Add incremental update of the
flattened OHLC -> line curve (unfortunately using `np.concatenate()` for
the moment) and maintain a new `._ds_line_xy` arrays tuple which keeps
the internal state. Add `.maybe_downsample()` as per the new interaction
update method requirement. Draft out some fast path curve stuff like in
our line graphic. Short-circuit bars path updates when we downsample to
line. Oh, and add a ton more profiling in prep for getting
all this stuff faf.
2022-04-13 08:11:33 -04:00
Tyler Goodlet f4feb6406f Add global profile timeout var 2022-04-13 08:11:33 -04:00
Tyler Goodlet ab58a05a11 Add "native" downsampling to our `FastAppendCurve`
Build out an interface that makes it super easy to downsample curves
using the m4 algorithm while keeping our incremental `QPainterPath`
update feature. A lot of hard work and tinkering went into getting this
working all in-thread correctly and there are quite a few details..

New interface methods:
- `.x_uppx()` which returns the x-axis "view units per pixel"
- `.px_width()` which returns the total (rounded) x-axis pixels spanned
    by the curve in view.
- `.should_ds_or_redraw()` a predicate which checks internal state to
  see if either downsampling of the curve should take place, or the curve
  should have all downsampling removed and be redrawn with source array
  data.
- `.downsample()` the actual ds processing routine which delegates into
  the m4 algo impl.
- `.maybe_downsample()` a simple update method which can be called by
  the view box when the user changes the zoom level.

Implementation details/changes:

- make `.update_from_array()` check for downsample (or revert to source
  aka de-downsample) conditions exist and then downsample and re-draw
  path graphics accordingly.
- in order to even further speed up path appends (since our main
  bottleneck is measured to be `QPainter.drawPath()` calls with large
  paths which are frequently updates), add a secondary path `.fast_path`
  which is the path that is real-time updates by incremental appends and
  which is painted separately for speed in `.pain()`.
- drop all the `QPolyLine` stuff since it was tested to be much slower
  in general and especially so for append-updates.
- stop disabling the cache settings on updates since it doesn't seem to
  be required any more?
- more move toward deprecating and removing all lingering interface
  requirements from `pg.PlotCurveItem` (like `.xData`/`.yData`).
- adjust `.paint()` and `.boundingRect()` to compensate for the new
  `.fast_path`
- add a butt-load of profiling B)
2022-04-13 08:11:33 -04:00
Tyler Goodlet e298fa2122 Add no-path guard now that we can use a poly 2022-04-13 08:11:33 -04:00
Tyler Goodlet 8ede51dbac First try, drop `FastAppendCurve` inheritance from `pg.PlotCurveItem` 2022-04-13 08:11:33 -04:00
Tyler Goodlet 84814f2c97 Drop commented line from pq method copy/paste 2022-04-13 08:11:33 -04:00
Tyler Goodlet e380fce790 Show baseline bars length on in view read < 6 2022-04-13 08:11:33 -04:00
Tyler Goodlet f145532a19 Bump up resolution log scaling a mag 2022-04-13 08:11:33 -04:00
Tyler Goodlet 865d156d2a Always clear previous downsample curve on switch
Pretty sure this was most of the cause of the stale (more downsampled)
curves showing when zooming in and out from bars mode quickly. All this
stuff needs to get factored out into a new abstraction anyway, but
i think this get's mostly correct functionality.

Only draw new ds curve on uppx steps >= 4 and stop adding/removing
graphics objects from the scene; doesn't seem to speed anything up
afaict. Add better reporting of ds scale changes.
2022-04-13 08:11:33 -04:00
Tyler Goodlet 736411b042 Clear ds line graphics on switch back to bars 2022-04-13 08:11:33 -04:00
Tyler Goodlet 411cc3a85e More ems resiliency: discard broken client dialogs 2022-04-13 08:11:33 -04:00
Tyler Goodlet c8d39fbc21 Allocate m4 output arrays in `numba` code, avoid segfaults? 2022-04-13 08:11:33 -04:00
Tyler Goodlet e89ccc618d Only clear/redraw curve on uppx diffs > 2
Only if the uppx increases by more then 2 we redraw the entire line
otherwise just ds with previous params and update the current curve.
This *should* avoid strange lower sample rate artefacts from showing on
updates.

Summary:
- stash both uppx and px width in `._dsi` (downsample info)
- use the new `ohlc_to_m4_line()` flags
- add notes about using `.reserve()` and friends
- always delete last `._array` ref prior to line updates
2022-04-13 08:11:33 -04:00