STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
backend.routers.optimizer Namespace Reference

Classes

class  DesignRequirementsRequest
class  DesignRequirementsResponse
class  Layer1Request
class  Layer2Request

Functions

tuple[bool, list] layer1_design_is_valid (Dict[str, Any] results)
Dict[str, Any] merge_design_requirements (Optional[Dict[str, Any]] old, Dict[str, Any] incoming)
 convert_numpy (obj)
str safe_json_dumps (Any payload)
 save_design_requirements (DesignRequirementsRequest request, UserSession session=Depends(get_session), None _=DesignCheckout)
 get_design_requirements (UserSession session=Depends(get_session))
 get_layer1_status (UserSession session=Depends(get_session))
 get_layer1_results (UserSession session=Depends(get_session))
 get_layer_results_csv (int layer, UserSession session=Depends(get_session))
 get_layer2_status (UserSession session=Depends(get_session))
 get_layer2_results (UserSession session=Depends(get_session))
 stop_layer2 (UserSession session=Depends(get_session))
 stop_layer1 (UserSession session=Depends(get_session))
 run_layer1 (float thrust_tolerance=0.1, float|None target_burn_time=None, int report_every_n=1, UserSession session=Depends(get_session), None _=DesignCheckout)
 run_layer2 (int max_iterations=20, bool save_plots=False, int de_maxiter=5, int de_popsize=2, int de_n_time_points=25, UserSession session=Depends(get_session), None _=DesignCheckout)
 upload_layer2_config (UploadFile file=FastAPIFile(...), UserSession session=Depends(get_session), None _=DesignCheckout)
 get_layer3_status (UserSession session=Depends(get_session))
 get_layer3_results (UserSession session=Depends(get_session))
 stop_layer3 (UserSession session=Depends(get_session))
 upload_layer3_config (UploadFile file=FastAPIFile(...), UserSession session=Depends(get_session), None _=DesignCheckout)
 run_layer3 (int max_iterations=20, bool save_plots=False, str optimization_method="gradient", UserSession session=Depends(get_session), None _=DesignCheckout)

Variables

 router = APIRouter(prefix="/api/optimizer", tags=["optimizer"])
dict _CSV_NAMES = {2: "pressure_curves.csv", 3: "layer3_results.csv"}

Detailed Description

Optimizer endpoints for design optimization and Layer 1.

Function Documentation

◆ convert_numpy()

backend.routers.optimizer.convert_numpy ( obj)
Recursively convert numpy types to Python native types for JSON serialization.

Definition at line 88 of file optimizer.py.

References convert_numpy().

Referenced by convert_numpy(), run_layer1(), run_layer2(), run_layer3(), and safe_json_dumps().

◆ get_design_requirements()

backend.routers.optimizer.get_design_requirements ( UserSession session = Depends(get_session))
Get current design requirements from config.

Definition at line 201 of file optimizer.py.

◆ get_layer1_results()

backend.routers.optimizer.get_layer1_results ( UserSession session = Depends(get_session))
Get Layer 1 optimization results.

Definition at line 228 of file optimizer.py.

◆ get_layer1_status()

backend.routers.optimizer.get_layer1_status ( UserSession session = Depends(get_session))
Get Layer 1 optimization status.

Definition at line 215 of file optimizer.py.

◆ get_layer2_results()

backend.routers.optimizer.get_layer2_results ( UserSession session = Depends(get_session))
Get Layer 2 optimization results.

Definition at line 281 of file optimizer.py.

◆ get_layer2_status()

backend.routers.optimizer.get_layer2_status ( UserSession session = Depends(get_session))
Get Layer 2 optimization status.

Definition at line 268 of file optimizer.py.

◆ get_layer3_results()

backend.routers.optimizer.get_layer3_results ( UserSession session = Depends(get_session))
Get Layer 3 optimization results.

Definition at line 901 of file optimizer.py.

◆ get_layer3_status()

backend.routers.optimizer.get_layer3_status ( UserSession session = Depends(get_session))
Get Layer 3 optimization status.

Definition at line 888 of file optimizer.py.

◆ get_layer_results_csv()

backend.routers.optimizer.get_layer_results_csv ( int layer,
UserSession session = Depends(get_session) )
Layer 2 or 3's pressure curves as CSV (backend/results_csv.py): time, LOX and fuel tank
pressure. The file the UI's "CSV" button saves, written here so anyone can fetch it.

Definition at line 247 of file optimizer.py.

◆ layer1_design_is_valid()

tuple[bool, list] backend.routers.optimizer.layer1_design_is_valid ( Dict[str, Any] results)
Did Layer 1 produce a design that passed its own validation gates?

Returns ``(is_valid, reasons)``. A design is valid only when it reports NO failure
reasons and no ``*_check_passed`` / ``*_gate_passed`` flag is False.

Why this exists: the optimized geometry used to be written back into the live config
unconditionally, INCLUDING when validation failed. A failed run then became the seed for
the next run, which started from a wrecked geometry, failed worse, and saved something
worse again -- a death spiral that bricked a working design (observed live: expansion_ratio
4.91 -> 9.74, oxidizer d_jet 2.33 -> 4.35 mm, and every subsequent run infeasible with the
UI giving no indication the seed was the problem). Combined with the known run-to-run
spread, one unlucky run in three could permanently destroy a design the user had converged.

Definition at line 20 of file optimizer.py.

Referenced by run_layer1().

◆ merge_design_requirements()

Dict[str, Any] backend.routers.optimizer.merge_design_requirements ( Optional[Dict[str, Any]] old,
Dict[str, Any] incoming )
Lay a (possibly partial) requirements payload over the requirements already loaded.

A key ABSENT from ``incoming`` keeps its current value. A key sent as an explicit
``None`` is cleared. Those are different intents -- a form that only knows a dozen
fields must not, by not mentioning them, reset the ~100 ``layer1_*`` knobs, the injector
face limits and the pinned seed to schema defaults. It did: the save route rebuilt
``design_requirements`` from the payload alone, and the next run optimised a different
problem than the one the file described. ``frozen_parameters`` merges key by key with the
same null-clears rule, as it already did.

Definition at line 47 of file optimizer.py.

Referenced by save_design_requirements().

◆ run_layer1()

backend.routers.optimizer.run_layer1 ( float thrust_tolerance = 0.1,
float | None target_burn_time = None,
int report_every_n = 1,
UserSession session = Depends(get_session),
None _ = DesignCheckout )
Run Layer 1 optimization with Server-Sent Events for progress updates.

Note: max_iterations is hardcoded in the optimizer for consistent robust convergence.

Returns a stream of progress updates in SSE format.

Definition at line 346 of file optimizer.py.

References convert_numpy(), and layer1_design_is_valid().

◆ run_layer2()

backend.routers.optimizer.run_layer2 ( int max_iterations = 20,
bool save_plots = False,
int de_maxiter = 5,
int de_popsize = 2,
int de_n_time_points = 25,
UserSession session = Depends(get_session),
None _ = DesignCheckout )
Run Layer 2 optimization with Server-Sent Events for progress updates.

Definition at line 608 of file optimizer.py.

References convert_numpy().

◆ run_layer3()

backend.routers.optimizer.run_layer3 ( int max_iterations = 20,
bool save_plots = False,
str optimization_method = "gradient",
UserSession session = Depends(get_session),
None _ = DesignCheckout )
Run Layer 3 thermal protection optimization with Server-Sent Events for progress updates.

Args:
    optimization_method: "gradient" (fast, ~5-15 evals), "cma" (thorough, ~60-80 evals), or "de" (fallback)

Definition at line 984 of file optimizer.py.

References convert_numpy().

◆ safe_json_dumps()

str backend.routers.optimizer.safe_json_dumps ( Any payload)
Strict JSON serialization for SSE: converts numpy + strips NaN/Inf.

Definition at line 119 of file optimizer.py.

References convert_numpy().

◆ save_design_requirements()

backend.routers.optimizer.save_design_requirements ( DesignRequirementsRequest request,
UserSession session = Depends(get_session),
None _ = DesignCheckout )
Save design requirements to config.

Definition at line 159 of file optimizer.py.

References merge_design_requirements().

◆ stop_layer1()

backend.routers.optimizer.stop_layer1 ( UserSession session = Depends(get_session))
Stop the currently running Layer 1 optimization.

Definition at line 321 of file optimizer.py.

◆ stop_layer2()

backend.routers.optimizer.stop_layer2 ( UserSession session = Depends(get_session))
Stop the currently running Layer 2 optimization.

Definition at line 296 of file optimizer.py.

◆ stop_layer3()

backend.routers.optimizer.stop_layer3 ( UserSession session = Depends(get_session))
Stop the currently running Layer 3 optimization.

Definition at line 916 of file optimizer.py.

◆ upload_layer2_config()

backend.routers.optimizer.upload_layer2_config ( UploadFile file = FastAPIFile(...),
UserSession session = Depends(get_session),
None _ = DesignCheckout )
Upload a config to use for Layer 2.

A wholesale replacement like /api/config/upload: behind the checkout, off the event loop,
with a new load_token (``replace_config``). Without the token a second tab of this user
kept autosaving -- the uploaded engine into its own design.

Definition at line 849 of file optimizer.py.

◆ upload_layer3_config()

backend.routers.optimizer.upload_layer3_config ( UploadFile file = FastAPIFile(...),
UserSession session = Depends(get_session),
None _ = DesignCheckout )
Upload a config to use for Layer 3 (should have pressure_curves from Layer 2).

A wholesale replacement: see upload_layer2_config.

Definition at line 941 of file optimizer.py.

Variable Documentation

◆ _CSV_NAMES

dict backend.routers.optimizer._CSV_NAMES = {2: "pressure_curves.csv", 3: "layer3_results.csv"}
protected

Definition at line 243 of file optimizer.py.

◆ router

backend.routers.optimizer.router = APIRouter(prefix="/api/optimizer", tags=["optimizer"])

Definition at line 125 of file optimizer.py.