o <@Yh= @sHddlZddlZddlmZddlZddlZddlZ e Z zddl m Z ddl mZmZWnddlm Z ddlmZmZYdZgdZdeeded eeeffd d Zd ejfd dZd eefddZdedeed eefddZdedBdedBdedefddZdYddZddZddZ dd Z!d!edBd dfd"d#Z"ded$ej#d!edBd dfd%d&Z$deded'eeefd!edBd df d(d)Z%d'eed eefd*d+Z&d ejfd,d-Z'ej(d.d/ed0!Z)ej*dd1EZ+e,d2ed3ej-d4d5d6Z.ej/d7d8d9Z0ej1d7gd5d:d;Z2e3d<ej4d=d5d>Z5ej4d?d5d>Z6ej-d@dAdBgdAdCZ7Wdn 1s8wYej8dDdEZ9e:gZ;e:dZge'e;e+gdFej=e)j>gee.dGdHej=e9j?gee.e0ee.j@gee.e0ge2e0gdGdIej=e)j>e.j@e2j@ge e.e2ge7dGdIe5j@e!e5e9d dJe2jAdKdLee2j@eDj@e6j@eCj@e7j@ge.e2e6e;eCe7gdGdTdUdVZIWdn 1s wYeJdWkr"e)jKegdd5dXdSdS)ZN)Any) SQLiteStorage) RESERVED_KEYSTRACKIO_LOGO_PATHz_ #run-cb .wrap { gap: 2px; } #run-cb .wrap label { line-height: 1; padding: 6px; } ) z#3B82F6z#EF4444z#10B981z#F59E0Bz#8B5CF6z#EC4899z#06B6D4z#84CC16z#F97316z#6366F1runs smoothingreturncCsXi}t|D]#\}}t|tt}|r%|||d<|d||d<q|||<q|S)z_Generate color mapping for runs, with transparency for original data when smoothing is enabled. _smoothedZ4D _original) enumerate COLOR_PALETTElen)rr color_mapirunZ base_colorr2/Users/nouamanetazi/projects/trackio/trackio/ui.pyget_color_mapping*s rrequestc Csntjd}t}|jd}rd}n d}|r|dnd}tjd||d||r3d|d|d d Sdd S) NTRACKIO_DATASET_IDprojectFTrProjectz<↻ Synced to z every 5 min)labelchoicesvalueallow_custom_value interactiveinfo)osenvirongetr get_projects query_paramsgrDropdown)r dataset_idprojectsrrrrrr!:s" r!cCs|sgSt|SN)rget_runs)rrrrr(Ns r(rc Cs|r|sddgSt}|D]"}t||}|r/t|}|jddj}dd|D}||q |d|dt t |}ddg}|D] } | |vrQ| | qF|S)z?Get all available metrics across all runs for x-axis selection.steptimenumberincludecSg|]}|tvr|qSrr.0crrr _z)get_available_metrics..) setr get_metricspd DataFrame select_dtypescolumnsupdateaddsort_metrics_by_prefixlistappend) rrZ all_metricsrmetricsdf numeric_colsZsorted_metricsresultmetricrrrget_available_metricsTs(       rErx_axisc Csl|r|sdSt||}|sdSt|}d|jvr"tt||d<|dkrHd|jvrHt|d|d<|d}|d|j |d<d}n |dkrOd}n|}|r|j ddj}dd|D}| } |d| d <d | d <| } t d td t|d } | |j| ddd| |<|d| d <d| d <tj| | gdd} || d<| S||d <d |d <||d<|S)Nr)r* timestampr+r,cSr.rr/r0rrrr3r4z!load_run_data..r roriginal data_type T)windowcenter min_periodsr Zsmoothed ignore_indexrF)rr6r7r8r:ranger to_datetimemindt total_secondsr9copymaxrollingmeanconcat) rrrrFr@rAZfirst_timestampx_columnrBZ df_originalZ df_smoothed window_sizeZ combined_dfrrr load_run_datarsL    r^Fcs~|dur g}d}nt|}t|}rfdd|D}|s/tj||dtjd|ddfStj|dtjd|ddfS) Nrcg|]}|vr|qSrrr1r filter_textrrr3r4zupdate_runs..rrzRuns ())r)r)r(r r# CheckboxGroupTextbox)rrcZuser_interacted_with_runsrZnum_runsrrbr update_runss  rhcs(t|}fdd|D}tj||dS)Ncr_rrr`rbrrr3r4zfilter_runs..rd)r(r#rf)rrcrrrbr filter_runssricCst||}tjd|ddS)z:Update x-axis dropdown choices based on available metrics.X-axisr)rrr)rEr#r$)rrZavailable_metricsrrrupdate_x_axis_choicess rlcCs|rtjddStjddS)NT)activeF)r#Timer)Zcb_valuerrr toggle_timers  rohf_tokencCs6tddkr|durtdt|}|dd}td}td}dd |d D}||d kr;||vr;td |d dkrd}|ddD];}|dddkrj|dd |d|krjd|dvrjd}n|dddkr|dd |krd|dvrd}nqI|stddS|d dkrtddSdS)NSYSTEMspacesz:Expected a HF_TOKEN to be provided when logging to a Spaceauth accessTokenZSPACE_AUTHOR_NAMEZSPACE_REPO_NAMEcSsg|]}|dqS)namer)r1orrrr3szcheck_auth..orgsruznExpected the provided hf_token to be the user owner of the space, or be a member of the org owner of the spaceroleZ fineGrainedFscopedentitytypespace/z repo.writeZ permissionsTuserzaExpected the provided hf_token with fine grained permissions to provide write access to the spacewritez;Expected the provided hf_token to provide write permissions)rgetenvPermissionErrorHfApiwhoami)rpwho access_tokenZ owner_name repo_namerwmatcheditemrrr check_authsZ        (r uploaded_dbcCsZt|t|}tj|rtd|dtjtj |ddt |d|dS)Nz1Trackio database file already exists for project z, cannot overwrite.T)exist_okpath) rrget_project_db_pathrrexistsr#ErrormakedirsdirnameshutilrW)rrrpZdb_project_pathrrrupload_db_to_spaces   rr@cCst|tj|||ddS)N)rrr@)rrlog)rrr@rprrrrsrcCsg}g}|D]}d|vr||q||q|i}|D]}|dd}||vr1g||<|||q g}t|D] }|t||qA||S)z Sort metrics by grouping prefixes together. Metrics without prefixes come first, then grouped by prefix. Example: Input: ["train/loss", "loss", "train/acc", "val/loss"] Output: ["loss", "train/acc", "train/loss", "val/loss"] r}r)r?sortsplitsortedkeysextend)r@Z no_prefixZ with_prefixrDZ prefix_groupsprefixZsorted_with_prefixrrrr=s"   r=cCsp|jd}|dkrtjddd}ndkrtjdd}n tjdd}|jd}r4|d |fSg|fS) Nsidebar collapsedFT)openvisiblehiddenrr@,)r"r r#Sidebarr)rZ sidebar_paramrr@rrr configure3s   rcitruszTrackio Dashboard)themetitlecssrzV
Trackio
rT)rrZRunszType to filter...)r placeholderzrun-cb)rrrelem_idz
zRefresh metrics realtime)rrzSmooth metricsrjr)r*rkrL)r)fnoutputsr)rr show_progress)rinputsrr)rrrapi_namecCsdS)NTrrrrr~r)rrr)rr select_datacCs|jSr')index)rrrr update_x_limsrcCs|r|siSi}|D]3}t||}|r9t|}d|jvr&tt||d<|js4|d ||<q d||<q d||<q |S)zHUpdate the last step from all runs to detect when new data is available.r)r) rr6r7r8r:rRr emptyrXr)rr last_stepsrr@rArrrupdate_last_stepss     r)triggersrrcsg}|}|D]}t||||} | dur|| q|r%tj|dd} nt} | jr.dSd} |rG|djsGd|djvrG|ddjd} | j ddj} dd | D} r`fd d | D} t t | } t ||} t jd d Yt| D]K\}}| j|gd }|jst j|| |d|jvrdnd| |d|d|||||gddd }|jttd|d|jddtd|dqvWddS1swYdS)NTrPr)rrFr+r,cSr.rr/r0rrrr3r4z$update_dashboard..csg|]}|vr|qSrrr0metrics_subsetrrr3r4row)key)subsetrzplot-i) xycolorrrrpreserved_by_keyx_limy_limshow_fullscreen_button min_widthzselect-)rrcSsdSr'rrrrrrrz"update_dashboard..zdouble-)rWr^r?r7r[r8rr:ilocr9r=r>rr#Rowr dropnaLinePlotrTrXselectrr double_click)rrrrZ x_lim_valuerFdfsZ original_runsrrAZ master_dfr\rBrZ metric_idx metric_nameZ metric_dfplotrrrupdate_dashboards^      "r__main__) allowed_pathsshow_api show_error)F)Lrrtypingrgradior#huggingface_hubhfpandasr7rtrackio.sqlite_storager trackio.utilsrrsqlite_storageutilsrr r>strbooldictrRequestr!r(rEr^rhrirlrorFileDatarrr=rBlocksdemorrMarkdownr$Z project_ddrgZrun_tbrfZrun_cbHTMLCheckboxZ realtime_cbZ smoothing_cbZ x_axis_ddrntimerStaterZuser_interacted_with_run_cbonloadtickchangeinputapirr SelectDatarrrenderr__name__launchrrrrs&    "" 1 /     "          4