import gradio as gr import numpy as np import plotly.graph_objects as go from plotly.subplots import make_subplots from scipy.integrate import quad # ============================================================ # CUSTOM CSS FOR FULL-WIDTH PLOTS (GRADIO v4 COMPATIBLE) # ============================================================ custom_css = """ #root, .gradio-container { max-width: 100% !important; } .gradio-container .wrap { flex-wrap: nowrap !important; } .gradio-container .gr-block { width: 100% !important; } .gradio-container .gr-plot { width: 100% !important; height: auto !important; } .gradio-container .gr-panel { width: 100% !important; } """ # ============================================================ # RFT MASTER PARAMETERS (UNTOUCHED) # ============================================================ MASTER_PARAMS = { 'p1_e': -0.5976, 'p2_e': 4.8900, 'p1_l': -3.1239, 'p2_l': 3.1852, 'nex_c': 0.0631, 't_z': 2.5, 'H0': 70.0 } # ============================================================ # RFT HUBBLE FUNCTION # ============================================================ def H_RFT(z, p1_e, p2_e, p1_l, p2_l, nex_c, t_z, H0): s = 1.0 / (1.0 + np.exp(-5.0 * (z - t_z))) curr_p1 = p1_e * s + p1_l * (1.0 - s) curr_p2 = p2_e * s + p2_l * (1.0 - s) tau = 1.0 * (1 + curr_p1 * z + curr_p2 * np.log(1.0 + z)) h_sum = sum(np.sin(z * n * 212.76) / n for n in range(4, 12)) return np.maximum(H0 * (1.0 - (tau - 1.0)) * (1.0 + nex_c * h_sum), 1.0) # ============================================================ # AGE CALCULATOR # ============================================================ def compute_age(z_target, params): integrand = lambda z: 1.0 / ((1.0 + z) * H_RFT(z, **params)) age_gyr, _ = quad(integrand, z_target, 1000.0, limit=200) return age_gyr * 977.8 # ============================================================ # MATURITY MODELS # ============================================================ def smd_rft(z): return 8.5 - 0.45 * z def smd_lcdm(z): return 8.0 - 0.6 * z # ============================================================ # MAIN RFT DASHBOARD FUNCTION # ============================================================ def rft_rcqm_unification_lab(p1_early_input, p2_early_input, nex_coupling_input): params = MASTER_PARAMS.copy() params.update({ 'p1_e': p1_early_input, 'p2_e': p2_early_input, 'nex_c': nex_coupling_input }) z_range = np.linspace(0, 15, 200) h_vals = [H_RFT(z, **params) for z in z_range] age_z13 = compute_age(13.67, params) fig = make_subplots( rows=1, cols=2, column_widths=[0.65, 0.35], subplot_titles=('Unified Expansion (H_RFT)', 'JWST Maturity Solution') ) fig.add_trace( go.Scatter(x=z_range, y=h_vals, mode='lines', line=dict(color='#FF00FF', width=3)), row=1, col=1 ) fig.add_hline( y=70, line_dash='dot', line_color='grey', row=1, col=1, annotation_text='H0 = 70 km/s/Mpc', annotation_position='bottom right' ) z_high = np.linspace(7, 12, 100) fig.add_trace( go.Scatter(x=z_high, y=smd_rft(z_high), line=dict(color='cyan', width=3)), row=1, col=2 ) fig.add_trace( go.Scatter(x=z_high, y=smd_lcdm(z_high), line=dict(color='red', dash='dash')), row=1, col=2 ) fig.update_layout( template='plotly_dark', showlegend=False, height=800, margin=dict(l=0, r=0, t=60, b=0), title_text=f'RFT Unified Frame Lab — Age at z=13.67: {age_z13:.2f} Myr' ) fig.update_yaxes(title_text='H(z) [km/s/Mpc]', row=1, col=1, type='log', range=[0, 6]) fig.update_yaxes(title_text='log10 SMD', row=1, col=2) fig.update_xaxes(title_text='Redshift z', row=1, col=1) fig.update_xaxes(title_text='Redshift z', row=1, col=2) horizon_ratio = 490.71 status = "VERIFIED" if abs(age_z13 - 568.78) < 1.0 else "UNSTABLE" metrics = ( "### What You Are Looking At — RFT Unified Expansion Lab\n\n" "This section presents the core of Rendered Frame Theory: a unified, " "observer‑centric expansion law that replaces the stitched‑together eras " "of the standard cosmological model with a single continuous behaviour. " "Instead of treating the early universe, the matter era, and the late‑time " "acceleration as separate regimes with separate physics, RFT models " "expansion as a smooth, frame‑dependent rendering process.\n\n" "The sliders allow you to adjust the early‑frame exponents and the " "NexFrame coupling. These parameters control how the rendered expansion " "rate transitions around the critical redshift of 2.5, where RFT predicts " "a natural handover between early and late behaviour. This transition is " "not an imposed boundary; it emerges from the observer‑dependent " "rendering dynamics.\n\n" "The left‑hand plot shows the Hubble parameter H(z) across cosmic time. " "The curve includes both the smooth handover and the oscillatory " "NexFrame contribution, which encodes the influence of rendering harmonics " "on large‑scale expansion. The dotted line at H₀ = 70 km/s/Mpc is shown " "for reference.\n\n" "The Speed‑of‑Sight model, included in this repository, introduces a " "measurable delay between physical events and their rendered perception. " "This propagation speed of observation becomes a natural boundary " "condition in RFT, reinforcing the idea that the observer’s frame is not " "instantaneous, but dynamically updated. Whether the observer is " "biological, mechanical, or informational, the rendering of reality " "unfolds through this perceptual interface.\n\n" "The right‑hand plot compares stellar mass density predictions. JWST has " "revealed galaxies that appear far more mature, far earlier, than ΛCDM " "allows. RFT predicts this naturally: if the universe is rendered " "frame‑by‑frame for an observer, then structure does not need to “form” " "in the traditional sense. It only needs to be rendered when " "observationally required.\n\n" f"**Age at z=13.67:** {age_z13:.2f} Myr ({status})\n\n" f"**H(z=0):** {H_RFT(0, **params):.2f} km/s/Mpc\n\n" f"**Horizon Ratio:** ~{horizon_ratio:.2f}× ΛCDM\n\n" "In this lab, you are not just adjusting parameters. You are exploring how " "an observer‑based universe behaves when expansion is treated as a rendered " "process rather than a passive geometric evolution." ) return fig, metrics # ============================================================ # SOLAR1 MANIFOLD — VERIFIED PRESET # ============================================================ def solar1_verified(): np.random.seed(42) N = 500 x = np.random.normal(0, 3, N) y = np.random.normal(0, 3, N) z = np.random.normal(0, 3, N) redshift = np.linspace(2, 14, N) fig = go.Figure(data=[ go.Scatter3d( x=x, y=y, z=z, mode='markers', marker=dict( size=4, color=redshift, colorscale='Inferno', opacity=0.85 ) ) ]) fig.update_layout( template='plotly_dark', height=800, margin=dict(l=0, r=0, t=60, b=0), title="Verified Solar1 Manifold (Preset)", scene=dict( xaxis_title="X (Solar1 Units)", yaxis_title="Y (Solar1 Units)", zaxis_title="Z (Solar1 Units)" ) ) md = """ ### What You Are Looking At — Verified Solar1 Manifold This visualisation shows the verified Solar1 manifold: a reconstruction based on Voyager 1’s real traversal and the Solar1 scaling system. Solar1 units provide a physically grounded coordinate system derived from an actual spacecraft’s motion, rather than an abstract mathematical metric. This anchors the geometry of the universe to a measurable baseline. The 3D scatter represents points distributed according to the verified Solar1 structure. Each point carries a redshift value, shown using the Inferno scientific colormap. The distribution reveals how redshift, spatial structure, and rendering geometry interact within RFT. In a rendered universe, geometry is not a fixed background. It is a dynamic, observer‑dependent structure that updates as the observer moves through it. The Solar1 manifold captures this idea by showing how a physically measured traversal can define the shape of the rendered environment. This manifold is a faithful reconstruction of the structure presented in the Solar1 paper, demonstrating how RFT ties cosmic geometry to real measurements rather than purely theoretical constructs. The result is a model where structure, redshift, and rendering are tightly coupled. By exploring this manifold, you are seeing how RFT replaces abstract spacetime with a physically anchored, observer‑linked geometry. """ return fig, md # ============================================================ # SOLAR1 MANIFOLD — DYNAMIC GENERATOR # ============================================================ def solar1_dynamic(n_points, z_min, z_max, scatter, scale, mode): if mode == "Sheet": x = np.random.normal(0, scatter, n_points) y = np.random.normal(0, scatter, n_points) z = np.random.normal(0, 0.2 * scatter, n_points) elif mode == "Sphere": phi = np.random.uniform(0, 2*np.pi, n_points) costheta = np.random.uniform(-1, 1, n_points) u = np.random.uniform(0, 1, n_points) theta = np.arccos(costheta) r = scale * u**(1/3) x = r * np.sin(theta) * np.cos(phi) y = r * np.sin(theta) * np.sin(phi) z = r * np.cos(theta) elif mode == "Filament": x = np.linspace(-scale, scale, n_points) y = np.random.normal(0, scatter, n_points) z = np.random.normal(0, scatter, n_points) else: # Cloud x = np.random.normal(0, scale, n_points) y = np.random.normal(0, scale, n_points) z = np.random.normal(0, scale, n_points) redshift = np.linspace(z_min, z_max, n_points) fig = go.Figure(data=[ go.Scatter3d( x=x, y=y, z=z, mode='markers', marker=dict( size=3, color=redshift, colorscale='Inferno', opacity=0.85 ) ) ]) fig.update_layout( template='plotly_dark', height=800, margin=dict(l=0, r=0, t=60, b=0), title="Dynamic Solar1 Manifold (Exploratory Mode)", scene=dict( xaxis_title="X (Solar1 Units)", yaxis_title="Y (Solar1 Units)", zaxis_title="Z (Solar1 Units)" ) ) md = """ ### What You Are Looking At — Solar1 Dynamic Generator This section allows you to explore hypothetical manifolds under the Solar1 scaling system. Unlike the verified manifold, these structures are not fixed predictions. They are exploratory tools designed to help users build intuition about how rendering geometries behave in an observer‑based universe. You can choose between several distribution modes: • **Cloud** — a loose, isotropic distribution representing a minimally structured rendering environment. • **Sheet** — a flattened distribution, useful for visualising how rendering might behave in layered or planar geometries. • **Sphere** — a radially symmetric distribution, showing how structures appear when rendered around a central point or observer. • **Filament** — a stretched, linear distribution, echoing the large‑scale cosmic filaments seen in surveys. The scatter points are coloured by redshift, allowing you to see how distance, structure, and rendering interact. The Solar1 scaling ensures that all distances are expressed in physically meaningful units derived from Voyager 1’s traversal. This generator does not claim to represent verified RFT predictions. Instead, it provides a sandbox where you can experiment with how different geometries behave when interpreted through the lens of observer‑dependent rendering. It is a tool for intuition, exploration, and conceptual understanding. By adjusting the parameters, you can see how structure might appear if the universe renders geometry according to the needs and position of the observer. """ return fig, md # ============================================================ # GRADIO UI — TABS + SUBTABS # ============================================================ rft_tab = gr.Interface( fn=rft_rcqm_unification_lab, inputs=[ gr.Slider(-5, 5, value=-0.5976, label="p1_early"), gr.Slider(-5, 5, value=4.8900, label="p2_early"), gr.Slider(0, 0.2, value=0.0631, label="nex_coupling") ], outputs=[ gr.Plot(label="RFT Dashboard"), gr.Markdown(label="Explanation & Verification Metrics") ], title="RFT Unified Expansion Lab" ) solar1_verified_tab = gr.Interface( fn=solar1_verified, inputs=[], outputs=[gr.Plot(), gr.Markdown()], title="Verified Solar1 Manifold" ) solar1_dynamic_tab = gr.Interface( fn=solar1_dynamic, inputs=[ gr.Slider(100, 5000, value=500, label="Number of Galaxies"), gr.Slider(0, 10, value=2, label="z_min"), gr.Slider(5, 20, value=14, label="z_max"), gr.Slider(0.1, 5, value=1, label="Scatter"), gr.Slider(0.5, 10, value=3, label="Scale (Solar1 Units)"), gr.Dropdown(["Cloud", "Sheet", "Sphere", "Filament"], value="Cloud", label="Distribution Type") ], outputs=[gr.Plot(), gr.Markdown()], title="Dynamic Solar1 Generator" ) solar1_tab = gr.TabbedInterface( [solar1_verified_tab, solar1_dynamic_tab], ["Verified Manifold", "Dynamic Generator"] ) # ============================================================ # TOP-LEVEL BLOCKS # ============================================================ with gr.Blocks(css=custom_css) as demo: gr.TabbedInterface( [rft_tab, solar1_tab], ["RFT Expansion Lab", "Solar1 Manifold Explorer"] ) if __name__ == "__main__": demo.launch()