Severian commited on
Commit
34ecc47
Β·
verified Β·
1 Parent(s): 905b3e5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +425 -14
app.py CHANGED
@@ -732,10 +732,296 @@ def create_entropy_geometry_plot(phi: np.ndarray):
732
 
733
  return fig
734
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
735
  def update_manifold_visualization(species_selection, emotion_selection, lens_selection,
736
  alpha_min, alpha_max, srl_min, srl_max,
737
  point_size, show_boundary, show_trajectories, color_scheme):
738
- """Update manifold visualization with filters."""
739
 
740
  df_filtered = df_combined.copy()
741
 
@@ -765,28 +1051,102 @@ def update_manifold_visualization(species_selection, emotion_selection, lens_sel
765
  text="No data points match the current filters",
766
  xref="paper", yref="paper", x=0.5, y=0.5, showarrow=False
767
  )
768
- return empty_fig
 
769
 
770
- return create_enhanced_manifold_plot(
 
771
  df_filtered, lens_selection, color_scheme, point_size,
772
  show_boundary, show_trajectories
773
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
774
 
775
  # ---------------------------------------------------------------
776
  # Gradio Interface
777
  # ---------------------------------------------------------------
778
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal", secondary_hue="cyan")) as demo:
779
  gr.Markdown("""
780
- # 🌟 **CMT Holographic Information Geometry Engine**
781
- *Full-featured visualization suite with mathematical rigor*
782
-
783
- **Features:**
784
- - Complete holographic field reconstruction
785
- - Cross-species communication mapping
786
- - Interactive 3D manifold exploration
787
- - Entropy and phase analysis
788
- - Side-by-side comparison capabilities
789
- - Automatic neighbor finding for grammar mapping
 
 
 
790
  """)
791
 
792
  with gr.Tabs():
@@ -830,9 +1190,26 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal", secondary_hue="cyan")) a
830
  choices=["Species", "Emotion", "CMT_Alpha", "CMT_SRL", "Cluster"],
831
  value="Species"
832
  )
 
 
 
 
 
 
 
 
 
833
 
834
  with gr.Column(scale=3):
835
  manifold_plot = gr.Plot(label="Universal Communication Manifold")
 
 
 
 
 
 
 
 
836
 
837
  # Wire up events
838
  manifold_inputs = [
@@ -841,12 +1218,27 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal", secondary_hue="cyan")) a
841
  point_size, show_species_boundary, show_trajectories, color_scheme
842
  ]
843
 
 
 
 
 
 
844
  for component in manifold_inputs:
845
  component.change(
846
  update_manifold_visualization,
847
  inputs=manifold_inputs,
848
- outputs=[manifold_plot]
849
  )
 
 
 
 
 
 
 
 
 
 
850
 
851
  with gr.TabItem("πŸ”¬ Interactive Holography"):
852
  with gr.Row():
@@ -1004,6 +1396,25 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal", secondary_hue="cyan")) a
1004
  outputs=cross_species_outputs
1005
  )
1006
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1007
  print("βœ… CMT Holographic Visualization Suite Ready!")
1008
 
1009
  if __name__ == "__main__":
 
732
 
733
  return fig
734
 
735
+ def create_2d_projection_plot(df_filtered, lens_selected, color_scheme):
736
+ """Create 2D projection plot."""
737
+ alpha_col = f"diag_alpha_{lens_selected}"
738
+ srl_col = f"diag_srl_{lens_selected}"
739
+
740
+ # Color mapping
741
+ if color_scheme == "Species":
742
+ color_values = [1 if s == "Human" else 0 for s in df_filtered['source']]
743
+ colorscale = [[0, '#1f77b4'], [1, '#ff7f0e']]
744
+ colorbar_title = "Species"
745
+ elif color_scheme == "Emotion":
746
+ unique_emotions = df_filtered['label'].unique()
747
+ emotion_map = {emotion: i for i, emotion in enumerate(unique_emotions)}
748
+ color_values = [emotion_map[label] for label in df_filtered['label']]
749
+ colorscale = 'Viridis'
750
+ colorbar_title = "Emotional State"
751
+ else:
752
+ color_values = df_filtered['cluster'].values
753
+ colorscale = 'Plotly3'
754
+ colorbar_title = "Cluster"
755
+
756
+ fig = go.Figure()
757
+
758
+ fig.add_trace(go.Scatter(
759
+ x=df_filtered['x'],
760
+ y=df_filtered['y'],
761
+ mode='markers',
762
+ marker=dict(
763
+ size=8,
764
+ color=color_values,
765
+ colorscale=colorscale,
766
+ showscale=True,
767
+ colorbar=dict(title=colorbar_title),
768
+ opacity=0.7,
769
+ line=dict(width=0.5, color='rgba(50,50,50,0.5)')
770
+ ),
771
+ text=[f"{row['source']}: {row['label']}" for _, row in df_filtered.iterrows()],
772
+ name='Communications'
773
+ ))
774
+
775
+ fig.update_layout(
776
+ title="2D Manifold Projection",
777
+ xaxis_title='Dimension 1',
778
+ yaxis_title='Dimension 2',
779
+ margin=dict(l=0, r=0, b=0, t=40)
780
+ )
781
+
782
+ return fig
783
+
784
+ def create_density_heatmap(df_filtered):
785
+ """Create density heatmap."""
786
+ from scipy.stats import gaussian_kde
787
+
788
+ if len(df_filtered) < 10:
789
+ return go.Figure(layout={"title": "Insufficient data for density plot"})
790
+
791
+ x = df_filtered['x'].values
792
+ y = df_filtered['y'].values
793
+
794
+ # Create density estimation
795
+ try:
796
+ kde = gaussian_kde(np.vstack([x, y]))
797
+
798
+ # Create grid
799
+ x_range = np.linspace(x.min(), x.max(), 50)
800
+ y_range = np.linspace(y.min(), y.max(), 50)
801
+ X, Y = np.meshgrid(x_range, y_range)
802
+ positions = np.vstack([X.ravel(), Y.ravel()])
803
+ Z = kde(positions).reshape(X.shape)
804
+
805
+ fig = go.Figure(data=go.Heatmap(
806
+ x=x_range,
807
+ y=y_range,
808
+ z=Z,
809
+ colorscale='Viridis',
810
+ showscale=True
811
+ ))
812
+
813
+ # Add scatter points
814
+ fig.add_trace(go.Scatter(
815
+ x=x, y=y,
816
+ mode='markers',
817
+ marker=dict(size=4, color='white', opacity=0.8),
818
+ name='Data Points'
819
+ ))
820
+
821
+ fig.update_layout(
822
+ title="Communication Density Landscape",
823
+ xaxis_title='Dimension 1',
824
+ yaxis_title='Dimension 2',
825
+ margin=dict(l=0, r=0, b=0, t=40)
826
+ )
827
+
828
+ return fig
829
+ except:
830
+ return go.Figure(layout={"title": "Could not create density plot"})
831
+
832
+ def create_feature_distributions(df_filtered, lens_selected):
833
+ """Create feature distribution plots."""
834
+ alpha_col = f"diag_alpha_{lens_selected}"
835
+ srl_col = f"diag_srl_{lens_selected}"
836
+
837
+ fig = make_subplots(
838
+ rows=2, cols=2,
839
+ subplot_titles=(
840
+ f"Alpha Distribution ({lens_selected})",
841
+ f"SRL Distribution ({lens_selected})",
842
+ "Species Distribution",
843
+ "Emotion Distribution"
844
+ ),
845
+ specs=[[{"type": "histogram"}, {"type": "histogram"}],
846
+ [{"type": "bar"}, {"type": "bar"}]]
847
+ )
848
+
849
+ # Alpha distribution
850
+ if alpha_col in df_filtered.columns:
851
+ fig.add_trace(go.Histogram(
852
+ x=df_filtered[alpha_col],
853
+ name="Alpha",
854
+ nbinsx=30,
855
+ marker_color='lightblue'
856
+ ), row=1, col=1)
857
+
858
+ # SRL distribution
859
+ if srl_col in df_filtered.columns:
860
+ fig.add_trace(go.Histogram(
861
+ x=df_filtered[srl_col],
862
+ name="SRL",
863
+ nbinsx=30,
864
+ marker_color='lightgreen'
865
+ ), row=1, col=2)
866
+
867
+ # Species distribution
868
+ species_counts = df_filtered['source'].value_counts()
869
+ fig.add_trace(go.Bar(
870
+ x=species_counts.index,
871
+ y=species_counts.values,
872
+ name="Species",
873
+ marker_color=['#1f77b4', '#ff7f0e']
874
+ ), row=2, col=1)
875
+
876
+ # Emotion distribution
877
+ emotion_counts = df_filtered['label'].value_counts().head(10)
878
+ fig.add_trace(go.Bar(
879
+ x=emotion_counts.index,
880
+ y=emotion_counts.values,
881
+ name="Emotions",
882
+ marker_color='lightcoral'
883
+ ), row=2, col=2)
884
+
885
+ fig.update_layout(
886
+ title_text="Statistical Distributions",
887
+ showlegend=False,
888
+ margin=dict(l=0, r=0, b=0, t=60)
889
+ )
890
+
891
+ return fig
892
+
893
+ def create_cluster_analysis(df_filtered):
894
+ """Create cluster analysis visualization."""
895
+ fig = make_subplots(
896
+ rows=1, cols=2,
897
+ subplot_titles=("Cluster Distribution", "Cluster Composition"),
898
+ specs=[[{"type": "bar"}, {"type": "bar"}]]
899
+ )
900
+
901
+ # Cluster distribution
902
+ cluster_counts = df_filtered['cluster'].value_counts().sort_index()
903
+ fig.add_trace(go.Bar(
904
+ x=[f"C{i}" for i in cluster_counts.index],
905
+ y=cluster_counts.values,
906
+ name="Cluster Size",
907
+ marker_color='skyblue'
908
+ ), row=1, col=1)
909
+
910
+ # Species composition per cluster
911
+ cluster_species = df_filtered.groupby(['cluster', 'source']).size().unstack(fill_value=0)
912
+ if len(cluster_species.columns) > 0:
913
+ for species in cluster_species.columns:
914
+ fig.add_trace(go.Bar(
915
+ x=[f"C{i}" for i in cluster_species.index],
916
+ y=cluster_species[species],
917
+ name=species,
918
+ marker_color='#1f77b4' if species == 'Human' else '#ff7f0e'
919
+ ), row=1, col=2)
920
+
921
+ fig.update_layout(
922
+ title_text="Cluster Analysis",
923
+ margin=dict(l=0, r=0, b=0, t=60)
924
+ )
925
+
926
+ return fig
927
+
928
+ def create_similarity_matrix(df_filtered, lens_selected):
929
+ """Create species similarity matrix."""
930
+ alpha_col = f"diag_alpha_{lens_selected}"
931
+ srl_col = f"diag_srl_{lens_selected}"
932
+
933
+ # Calculate mean values for each species-emotion combination
934
+ similarity_data = []
935
+
936
+ for species in df_filtered['source'].unique():
937
+ for emotion in df_filtered['label'].unique():
938
+ subset = df_filtered[(df_filtered['source'] == species) & (df_filtered['label'] == emotion)]
939
+ if len(subset) > 0:
940
+ alpha_mean = subset[alpha_col].mean() if alpha_col in subset.columns else 0
941
+ srl_mean = subset[srl_col].mean() if srl_col in subset.columns else 0
942
+ similarity_data.append({
943
+ 'species': species,
944
+ 'emotion': emotion,
945
+ 'alpha': alpha_mean,
946
+ 'srl': srl_mean,
947
+ 'combined': alpha_mean + srl_mean
948
+ })
949
+
950
+ if not similarity_data:
951
+ return go.Figure(layout={"title": "No data for similarity matrix"})
952
+
953
+ similarity_df = pd.DataFrame(similarity_data)
954
+ pivot_table = similarity_df.pivot(index='emotion', columns='species', values='combined')
955
+
956
+ fig = go.Figure(data=go.Heatmap(
957
+ z=pivot_table.values,
958
+ x=pivot_table.columns,
959
+ y=pivot_table.index,
960
+ colorscale='RdYlBu_r',
961
+ showscale=True,
962
+ colorbar=dict(title="Similarity Score")
963
+ ))
964
+
965
+ fig.update_layout(
966
+ title="Cross-Species Similarity Matrix",
967
+ margin=dict(l=0, r=0, b=0, t=40)
968
+ )
969
+
970
+ return fig
971
+
972
+ def calculate_live_statistics(df_filtered, lens_selected):
973
+ """Calculate live statistics for the dataset."""
974
+ alpha_col = f"diag_alpha_{lens_selected}"
975
+ srl_col = f"diag_srl_{lens_selected}"
976
+
977
+ stats = {
978
+ 'total_samples': len(df_filtered),
979
+ 'species_counts': df_filtered['source'].value_counts().to_dict(),
980
+ 'emotion_counts': len(df_filtered['label'].unique()),
981
+ 'cluster_count': len(df_filtered['cluster'].unique())
982
+ }
983
+
984
+ if alpha_col in df_filtered.columns:
985
+ stats['alpha_mean'] = df_filtered[alpha_col].mean()
986
+ stats['alpha_std'] = df_filtered[alpha_col].std()
987
+
988
+ if srl_col in df_filtered.columns:
989
+ stats['srl_mean'] = df_filtered[srl_col].mean()
990
+ stats['srl_std'] = df_filtered[srl_col].std()
991
+
992
+ # Format as HTML
993
+ html_content = f"""
994
+ <div style="padding: 10px; background-color: #f0f8ff; border-radius: 8px;">
995
+ <h4>πŸ“Š Live Dataset Statistics</h4>
996
+ <p><strong>Total Samples:</strong> {stats['total_samples']}</p>
997
+ <p><strong>Species:</strong>
998
+ {' | '.join([f"{k}: {v}" for k, v in stats['species_counts'].items()])}
999
+ </p>
1000
+ <p><strong>Emotions:</strong> {stats['emotion_counts']}</p>
1001
+ <p><strong>Clusters:</strong> {stats['cluster_count']}</p>
1002
+ """
1003
+
1004
+ if 'alpha_mean' in stats:
1005
+ html_content += f"""
1006
+ <p><strong>Alpha ({lens_selected}):</strong>
1007
+ ΞΌ={stats['alpha_mean']:.3f}, Οƒ={stats['alpha_std']:.3f}
1008
+ </p>
1009
+ """
1010
+
1011
+ if 'srl_mean' in stats:
1012
+ html_content += f"""
1013
+ <p><strong>SRL ({lens_selected}):</strong>
1014
+ ΞΌ={stats['srl_mean']:.3f}, Οƒ={stats['srl_std']:.3f}
1015
+ </p>
1016
+ """
1017
+
1018
+ html_content += "</div>"
1019
+ return html_content
1020
+
1021
  def update_manifold_visualization(species_selection, emotion_selection, lens_selection,
1022
  alpha_min, alpha_max, srl_min, srl_max,
1023
  point_size, show_boundary, show_trajectories, color_scheme):
1024
+ """Update all manifold visualizations with filters."""
1025
 
1026
  df_filtered = df_combined.copy()
1027
 
 
1051
  text="No data points match the current filters",
1052
  xref="paper", yref="paper", x=0.5, y=0.5, showarrow=False
1053
  )
1054
+ empty_stats = "<p>No data available</p>"
1055
+ return empty_fig, empty_fig, empty_fig, empty_fig, empty_fig, empty_fig, empty_stats
1056
 
1057
+ # Create all visualizations
1058
+ main_plot = create_enhanced_manifold_plot(
1059
  df_filtered, lens_selection, color_scheme, point_size,
1060
  show_boundary, show_trajectories
1061
  )
1062
+
1063
+ projection_2d = create_2d_projection_plot(df_filtered, lens_selection, color_scheme)
1064
+ density_plot = create_density_heatmap(df_filtered)
1065
+ feature_dists = create_feature_distributions(df_filtered, lens_selection)
1066
+ cluster_plot = create_cluster_analysis(df_filtered)
1067
+ similarity_plot = create_similarity_matrix(df_filtered, lens_selection)
1068
+ stats_html = calculate_live_statistics(df_filtered, lens_selection)
1069
+
1070
+ return main_plot, projection_2d, density_plot, feature_dists, cluster_plot, similarity_plot, stats_html
1071
+
1072
+ def export_filtered_data(species_selection, emotion_selection, lens_selection,
1073
+ alpha_min, alpha_max, srl_min, srl_max):
1074
+ """Export filtered dataset for analysis."""
1075
+ import tempfile
1076
+ import json
1077
+
1078
+ df_filtered = df_combined.copy()
1079
+
1080
+ if species_selection:
1081
+ df_filtered = df_filtered[df_filtered['source'].isin(species_selection)]
1082
+
1083
+ if emotion_selection:
1084
+ df_filtered = df_filtered[df_filtered['label'].isin(emotion_selection)]
1085
+
1086
+ alpha_col = f"diag_alpha_{lens_selection}"
1087
+ srl_col = f"diag_srl_{lens_selection}"
1088
+
1089
+ if alpha_col in df_filtered.columns:
1090
+ df_filtered = df_filtered[
1091
+ (df_filtered[alpha_col] >= alpha_min) &
1092
+ (df_filtered[alpha_col] <= alpha_max)
1093
+ ]
1094
+
1095
+ if srl_col in df_filtered.columns:
1096
+ df_filtered = df_filtered[
1097
+ (df_filtered[srl_col] >= srl_min) &
1098
+ (df_filtered[srl_col] <= srl_max)
1099
+ ]
1100
+
1101
+ if len(df_filtered) == 0:
1102
+ return "<p style='color: red;'>❌ No data to export with current filters</p>"
1103
+
1104
+ # Create export summary
1105
+ export_summary = {
1106
+ "export_timestamp": pd.Timestamp.now().isoformat(),
1107
+ "total_samples": len(df_filtered),
1108
+ "species_counts": df_filtered['source'].value_counts().to_dict(),
1109
+ "emotion_types": df_filtered['label'].unique().tolist(),
1110
+ "lens_used": lens_selection,
1111
+ "filters_applied": {
1112
+ "species": species_selection,
1113
+ "emotions": emotion_selection,
1114
+ "alpha_range": [alpha_min, alpha_max],
1115
+ "srl_range": [srl_min, srl_max]
1116
+ }
1117
+ }
1118
+
1119
+ summary_html = f"""
1120
+ <div style="padding: 10px; background-color: #e8f5e8; border-radius: 8px; margin-top: 10px;">
1121
+ <h4>βœ… Export Ready</h4>
1122
+ <p><strong>Samples:</strong> {export_summary['total_samples']}</p>
1123
+ <p><strong>Species:</strong> {', '.join([f"{k}({v})" for k, v in export_summary['species_counts'].items()])}</p>
1124
+ <p><strong>Emotions:</strong> {len(export_summary['emotion_types'])} types</p>
1125
+ <p><strong>Lens:</strong> {lens_selection}</p>
1126
+ <p><em>Data ready for download via your browser's dev tools or notebook integration.</em></p>
1127
+ </div>
1128
+ """
1129
+
1130
+ return summary_html
1131
 
1132
  # ---------------------------------------------------------------
1133
  # Gradio Interface
1134
  # ---------------------------------------------------------------
1135
  with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal", secondary_hue="cyan")) as demo:
1136
  gr.Markdown("""
1137
+ # 🌟 **CMT Holographic Information Geometry Engine v5.0**
1138
+ *Revolutionary interspecies communication analysis platform*
1139
+
1140
+ **πŸš€ Enhanced Features:**
1141
+ - **🌌 Universal Manifold Explorer**: Multi-dimensional visualization suite with live statistics
1142
+ - **πŸ”¬ Interactive Holography**: Cross-species communication mapping with mathematical precision
1143
+ - **πŸ“Š Real-time Analytics**: Dynamic filtering, clustering, and similarity analysis
1144
+ - **🎨 Rich Visualizations**: 2D/3D plots, density heatmaps, feature distributions
1145
+ - **πŸ’Ύ Data Export**: Export filtered datasets for external analysis
1146
+ - **⚑ Auto-loading**: Manifold visualizations load automatically on startup
1147
+
1148
+ ---
1149
+ **🎯 Goal**: Map the geometric structure of communication to reveal universal patterns across species
1150
  """)
1151
 
1152
  with gr.Tabs():
 
1190
  choices=["Species", "Emotion", "CMT_Alpha", "CMT_SRL", "Cluster"],
1191
  value="Species"
1192
  )
1193
+
1194
+ with gr.Accordion("πŸ“Š Live Statistics", open=True):
1195
+ stats_html = gr.HTML(label="Dataset Statistics")
1196
+ similarity_matrix = gr.Plot(label="Species Similarity Matrix")
1197
+
1198
+ with gr.Accordion("πŸ’Ύ Data Export", open=False):
1199
+ gr.Markdown("**Export filtered dataset for further analysis**")
1200
+ export_button = gr.Button("πŸ“₯ Export Filtered Data", variant="secondary")
1201
+ export_status = gr.HTML("")
1202
 
1203
  with gr.Column(scale=3):
1204
  manifold_plot = gr.Plot(label="Universal Communication Manifold")
1205
+
1206
+ with gr.Row():
1207
+ projection_2d = gr.Plot(label="2D Projection")
1208
+ density_plot = gr.Plot(label="Density Heatmap")
1209
+
1210
+ with gr.Row():
1211
+ feature_distributions = gr.Plot(label="Feature Distributions")
1212
+ cluster_analysis = gr.Plot(label="Cluster Analysis")
1213
 
1214
  # Wire up events
1215
  manifold_inputs = [
 
1218
  point_size, show_species_boundary, show_trajectories, color_scheme
1219
  ]
1220
 
1221
+ manifold_outputs = [
1222
+ manifold_plot, projection_2d, density_plot,
1223
+ feature_distributions, cluster_analysis, similarity_matrix, stats_html
1224
+ ]
1225
+
1226
  for component in manifold_inputs:
1227
  component.change(
1228
  update_manifold_visualization,
1229
  inputs=manifold_inputs,
1230
+ outputs=manifold_outputs
1231
  )
1232
+
1233
+ # Wire up export button
1234
+ export_button.click(
1235
+ export_filtered_data,
1236
+ inputs=[
1237
+ species_filter, emotion_filter, lens_selector,
1238
+ alpha_min, alpha_max, srl_min, srl_max
1239
+ ],
1240
+ outputs=[export_status]
1241
+ )
1242
 
1243
  with gr.TabItem("πŸ”¬ Interactive Holography"):
1244
  with gr.Row():
 
1396
  outputs=cross_species_outputs
1397
  )
1398
 
1399
+ # Auto-load manifold visualizations on startup
1400
+ demo.load(
1401
+ update_manifold_visualization,
1402
+ inputs=[
1403
+ gr.State(["Human", "Dog"]), # species_filter default
1404
+ gr.State(list(df_combined['label'].unique())), # emotion_filter default
1405
+ gr.State("gamma"), # lens_selector default
1406
+ gr.State(0), # alpha_min default
1407
+ gr.State(5), # alpha_max default
1408
+ gr.State(0), # srl_min default
1409
+ gr.State(100), # srl_max default
1410
+ gr.State(6), # point_size default
1411
+ gr.State(True), # show_species_boundary default
1412
+ gr.State(False), # show_trajectories default
1413
+ gr.State("Species") # color_scheme default
1414
+ ],
1415
+ outputs=manifold_outputs
1416
+ )
1417
+
1418
  print("βœ… CMT Holographic Visualization Suite Ready!")
1419
 
1420
  if __name__ == "__main__":