From dc6dc4dd6094bbc9917911aaccbeef9cfcc5ea5e Mon Sep 17 00:00:00 2001 From: Jon Belof Date: Mon, 1 Jun 2026 05:57:27 -0500 Subject: [PATCH 1/5] initial commit of ICF multi-agent RL training example + zenith SFT training of specialize LLM --- MLExamples/icf_4agent/README.md | 202 + MLExamples/icf_4agent/app.py | 342 + MLExamples/icf_4agent/chatml_simple.jinja | 8 + MLExamples/icf_4agent/create_aivenv.sh | 13 + MLExamples/icf_4agent/docs/IEEEtran.cls | 6347 +++++++++++++++++ MLExamples/icf_4agent/docs/summary.pdf | Bin 0 -> 274343 bytes MLExamples/icf_4agent/docs/summary.tex | 453 ++ MLExamples/icf_4agent/icf_core.py | 253 + MLExamples/icf_4agent/icf_mcp_server.py | 71 + MLExamples/icf_4agent/requirements.txt | 8 + MLExamples/icf_4agent/start_app.sh | 33 + MLExamples/icf_4agent/start_vllm.sh | 79 + MLExamples/zenith/Dockerfile.zenith | 312 + .../zenith/SFT_HEDP_dataset/hedp_basics.json | 34 + .../SFT_HEDP_dataset/hedp_darkstar_rmi.json | 65 + .../SFT_HEDP_dataset/hedp_dataset.jsonl | 149 + .../zenith/SFT_HEDP_dataset/hedp_eos.json | 34 + .../SFT_HEDP_dataset/hedp_icf_basics.json | 35 + .../SFT_HEDP_dataset/hedp_radhydro.json | 34 + .../hedp_radhydro_simulation.json | 155 + MLExamples/zenith/VERSION | 1 + MLExamples/zenith/create_aivenv.sh | 34 + MLExamples/zenith/dataset_validation.py | 105 + MLExamples/zenith/gpt-oss-20b-fft-hedp.yaml | 102 + .../zenith/gpt-oss-20b-fft-hedp.zero3.json | 29 + ...inistral-3-14B-cpt-science.preprocess.yaml | 54 + .../ministral-3-14B-cpt-science.train.yaml | 84 + .../ministral-3-14B-cpt-science.zero3.json | 33 + .../zenith/ministral-3-14B-fft-hedp.yaml | 63 + .../ministral-3-14B-fft-hedp.zero3.json | 30 + .../zenith/mistral-small-4-119B-fft-hedp.yaml | 75 + .../mistral-small-4-119B-fft-hedp.zero3.json | 32 + MLExamples/zenith/process_scibase.py | 116 + MLExamples/zenith/ray_health_fa2.py | 55 + MLExamples/zenith/ray_health_overall.py | 51 + MLExamples/zenith/ray_health_rccl.py | 71 + MLExamples/zenith/requirements.txt | 117 + MLExamples/zenith/run_container.sh | 156 + MLExamples/zenith/submit_zenith.sh | 43 + .../zenith/zenith_container_launcher.sh | 287 + 40 files changed, 10165 insertions(+) create mode 100644 MLExamples/icf_4agent/README.md create mode 100644 MLExamples/icf_4agent/app.py create mode 100644 MLExamples/icf_4agent/chatml_simple.jinja create mode 100755 MLExamples/icf_4agent/create_aivenv.sh create mode 100644 MLExamples/icf_4agent/docs/IEEEtran.cls create mode 100644 MLExamples/icf_4agent/docs/summary.pdf create mode 100644 MLExamples/icf_4agent/docs/summary.tex create mode 100644 MLExamples/icf_4agent/icf_core.py create mode 100644 MLExamples/icf_4agent/icf_mcp_server.py create mode 100644 MLExamples/icf_4agent/requirements.txt create mode 100755 MLExamples/icf_4agent/start_app.sh create mode 100755 MLExamples/icf_4agent/start_vllm.sh create mode 100644 MLExamples/zenith/Dockerfile.zenith create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_basics.json create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_darkstar_rmi.json create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_dataset.jsonl create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_eos.json create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_icf_basics.json create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro.json create mode 100644 MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro_simulation.json create mode 100644 MLExamples/zenith/VERSION create mode 100755 MLExamples/zenith/create_aivenv.sh create mode 100644 MLExamples/zenith/dataset_validation.py create mode 100644 MLExamples/zenith/gpt-oss-20b-fft-hedp.yaml create mode 100644 MLExamples/zenith/gpt-oss-20b-fft-hedp.zero3.json create mode 100644 MLExamples/zenith/ministral-3-14B-cpt-science.preprocess.yaml create mode 100644 MLExamples/zenith/ministral-3-14B-cpt-science.train.yaml create mode 100644 MLExamples/zenith/ministral-3-14B-cpt-science.zero3.json create mode 100644 MLExamples/zenith/ministral-3-14B-fft-hedp.yaml create mode 100644 MLExamples/zenith/ministral-3-14B-fft-hedp.zero3.json create mode 100644 MLExamples/zenith/mistral-small-4-119B-fft-hedp.yaml create mode 100644 MLExamples/zenith/mistral-small-4-119B-fft-hedp.zero3.json create mode 100644 MLExamples/zenith/process_scibase.py create mode 100644 MLExamples/zenith/ray_health_fa2.py create mode 100644 MLExamples/zenith/ray_health_overall.py create mode 100644 MLExamples/zenith/ray_health_rccl.py create mode 100644 MLExamples/zenith/requirements.txt create mode 100755 MLExamples/zenith/run_container.sh create mode 100755 MLExamples/zenith/submit_zenith.sh create mode 100755 MLExamples/zenith/zenith_container_launcher.sh diff --git a/MLExamples/icf_4agent/README.md b/MLExamples/icf_4agent/README.md new file mode 100644 index 00000000..9e169c8b --- /dev/null +++ b/MLExamples/icf_4agent/README.md @@ -0,0 +1,202 @@ +# Adversarial Multi-Agent ICF Capsule Optimizer + +A multi-agent system that autonomously optimizes Inertial Confinement Fusion (ICF) capsule designs under realistic manufacturing uncertainty. A Design Explorer agent maximizes fusion yield while a Defect Adversary agent stress-tests designs with manufacturing imperfections, orchestrated by a Principal Investigator agent — all powered by LLM reasoning and a fast physics surrogate. + +## Architecture + +``` +┌─────────────────────────────────────────────┐ +│ AutoGen Agent Swarm │ +│ │ +│ ┌───────────────────────────────────┐ │ +│ │ Principal Investigator (PI) │ │ +│ │ Orchestrator / Evaluator │ │ +│ └──────┬────────────────┬──────────┘ │ +│ │ │ │ +│ ┌──────▼──────┐ ┌─────▼────────┐ │ +│ │ Design │ │ Defect │ │ +│ │ Explorer │ │ Adversary │ │ +│ └─────────────┘ └──────────────┘ │ +│ │ │ +│ ┌──────▼──────┐ │ +│ │ User Proxy │ ◄── tool execution only │ +│ └──────┬──────┘ │ +└──────────┼──────────────────────────────────┘ + │ stdio / JSON-RPC + ┌──────▼──────────────┐ + │ MCP Server │ + │ (ICF Surrogate) │ + └─────────────────────┘ +``` + +The agents communicate through AutoGen's group chat with constrained speaker transitions. Only the PI can invoke the physics simulation, ensuring a structured optimization loop. The physics engine is decoupled from the agents via the Model Context Protocol (MCP), allowing the backend to be swapped from this fast surrogate to a full radiation hydrodynamics code without changing any agent logic. + +## Physics Model + +The surrogate implements a 0D deceleration-phase model combining: + +- **Hurricane et al. (2014)** — dual-piston stagnation mechanics with mode-1 asymmetry +- **Betti et al. (2002)** — Spitzer electron thermal ablation and marginal ignition physics +- **NRL Plasma Formulary** — Gamow DT thermonuclear burn rate +- **Linear Rayleigh-Taylor** instability growth tracking + +The model solves a stiff 9-component ODE system (shell positions, velocities, hot-spot energy, yield, RT growth, fuel mass, hot-spot mass) using the Radau implicit integrator. Each evaluation takes < 1 second, enabling thousands of design iterations. + +### Optimization Formulation + +The system solves a min-max game: + +``` +max_x min_d Y(x, d) +``` + +where **x** = (R0, v0, T0, M_sh, M_hs) are design parameters and **d** = (delta, mode, roughness) are manufacturing defects, subject to a fixed kinetic energy budget: KE = ½ M_sh v0² = 0.015 × E_laser. + +## Files + +| File | Description | +|---|---| +| `app.py` | Multi-agent orchestration, Gradio UI, LLM configuration | +| `icf_core.py` | Standalone physics engine (ODE solver) | +| `icf_mcp_server.py` | MCP tool server wrapping the physics engine with parameter validation | +| `start_app.sh` | Launch script for the agent application | +| `start_vllm.sh` | Launch script for local vLLM inference server | +| `requirements.txt` | Python dependencies | +| `docs/summary.tex` | Manuscript (IEEE format) | + +## Setup + +### Prerequisites + +- Python 3.10+ +- For local inference: AMD GPUs with ROCm, podman or docker, vLLM container image + +Before starting any container, make sure to prep the underlying fs (especially if running rootless): +``` +cat > ~/.config/containers/storage.conf +[storage] +driver = "overlay" + +[storage.options] +mount_program = "/usr/bin/fuse-overlayfs" + +[storage.options.overlay] +``` + +### Install + +```bash +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +``` + +## Running + +The system supports two LLM backends: a cloud API (Anthropic) and local inference (vLLM with OpenAI-compatible API). + +### Option A: Cloud API (Anthropic) + +Set the API credentials and run: + +```bash +export ANTHROPIC_API_KEY="your-key" +export ANTHROPIC_BASE_URL="https://api.anthropic.com" + +ICF_API_TYPE=anthropic ./start_app.sh +``` + +### Option B: Local Inference (vLLM + ROCm) + +Download the latest ROCm vLLM dev image from [dockerhub](http://hub.docker.com/r/rocm/vllm-dev/tags), e.g. +``` +podman pull rocm/vllm-dev:nightly_main_20260531 && podman save rocm/vllm-dev:nightly_main_20260531 -o vllm_rocm_nightly_main_20260531.tar +``` +Start the vLLM server in one terminal, then the app in another: + +```bash +# Terminal 1 — start vLLM +./start_vllm.sh + +# Terminal 2 — start the app +./start_app.sh +``` + +The app opens a Gradio web UI with a public share link (no X server needed). Enter a prompt like: + +> Find a robust capsule design that maximizes fusion yield at 3 MJ laser energy + +Agent messages stream to the browser in real time as each agent contributes. + +### Running the Physics Engine Standalone + +```bash +source venv/bin/activate + +# default parameters (symmetric, no defects) +python3 icf_core.py + +# with defects +python3 icf_core.py --delta 0.1 --mode 20 --roughness 2e-6 + +# with plotting +python3 icf_core.py --plot + +# custom design point +python3 icf_core.py --R0 1.2e-4 --v0 -5e5 --M_sh 3.6e-7 --M_hs 8e-9 --T0 1.2 +``` + +## Environment Variables + +### Backend Selection + +| Variable | Default | Description | +|---|---|---| +| `ICF_API_TYPE` | `anthropic` | LLM backend: `anthropic` or `openai` | + +### Per-Role LLM Configuration + +Each agent role (Explorer, Frontier) has independent settings with fallback defaults: + +| Variable | Anthropic Default | OpenAI Default | Description | +|---|---|---|---| +| `ICF_EXPLORER_API_KEY` | `$ANTHROPIC_API_KEY` | `unused` | Explorer LLM API key | +| `ICF_EXPLORER_BASE_URL` | `$ANTHROPIC_BASE_URL` | `http://localhost:8000/v1` | Explorer LLM endpoint | +| `ICF_EXPLORER_MODEL` | `Claude-Sonnet-4.5` | `gptoss-20b-hedp` | Explorer model name | +| `ICF_FRONTIER_API_KEY` | `$ANTHROPIC_API_KEY` | `unused` | PI + Adversary API key | +| `ICF_FRONTIER_BASE_URL` | `$ANTHROPIC_BASE_URL` | `http://localhost:8000/v1` | PI + Adversary endpoint | +| `ICF_FRONTIER_MODEL` | `Claude-Sonnet-4.5` | `gptoss-20b-hedp` | PI + Adversary model name | +| `ICF_EXPLORER_CUSTOM_HEADERS` | `$ANTHROPIC_CUSTOM_HEADERS` | — | Custom HTTP headers (Anthropic mode only) | +| `ICF_FRONTIER_CUSTOM_HEADERS` | `$ANTHROPIC_CUSTOM_HEADERS` | — | Custom HTTP headers (Anthropic mode only) | + +### vLLM Server Configuration + +| Variable | Default | Description | +|---|---|---| +| `ICF_VLLM_MODEL_PATH` | `~/hfmodels/gptoss-20b-hedp.03302026` | Path to model weights | +| `ICF_VLLM_MODEL_NAME` | `gptoss-20b-hedp` | Served model name | +| `ICF_VLLM_IMAGE_TAR` | `~/vllm_rocm_nightly_main_20260531.tar` | vLLM container image tarball | +| `ICF_VLLM_PORT` | `8000` | Port for the vLLM server | +| `ICF_VLLM_TP_SIZE` | `1` | Tensor parallel degree (number of GPUs) | +| `ICF_VLLM_MAX_MODEL_LEN` | `4096` | Maximum sequence length | + +## Parameter Bounds + +The MCP server enforces hard physical bounds on all inputs. Values outside these ranges are clamped and a warning is returned to the agent: + +| Parameter | Min | Max | Description | +|---|---|---|---| +| R0 | 3×10⁻⁵ m | 5×10⁻⁴ m | Deceleration-phase shell radius | +| v0 | -8×10⁵ m/s | -1×10⁵ m/s | Implosion velocity (inward) | +| T0 | 0.1 keV | 10 keV | Initial hot-spot temperature | +| M_sh | 10⁻⁸ kg | 2×10⁻⁶ kg | Shell mass | +| M_hs | 10⁻⁹ kg | 10⁻⁷ kg | Initial hot-spot mass | +| delta | 0.0 | 0.15 | Mode-1 asymmetry fraction | +| mode | 2 | 40 | RT perturbation mode number | +| roughness | 0.0 m | 3×10⁻⁶ m | Surface roughness | + +## References + +- O. A. Hurricane et al., "Fuel gain exceeding unity in an inertially confined fusion implosion," *Nature*, 506, 343–348, 2014. +- R. Betti et al., "Deceleration phase of inertial confinement fusion implosions," *Phys. Plasmas*, 9(5), 2277–2286, 2002. +- J. D. Huba, *NRL Plasma Formulary*, Naval Research Laboratory, 2019. diff --git a/MLExamples/icf_4agent/app.py b/MLExamples/icf_4agent/app.py new file mode 100644 index 00000000..c5c3a13f --- /dev/null +++ b/MLExamples/icf_4agent/app.py @@ -0,0 +1,342 @@ +import os +import sys +import threading +import time +import autogen +import gradio as gr +import asyncio +from mcp import ClientSession, StdioServerParameters +from mcp.client.stdio import stdio_client + +# --- API backend: "anthropic" (cloud API) or "openai" (vLLM / local) --- +API_TYPE = os.environ.get("ICF_API_TYPE", "anthropic") + +if API_TYPE == "anthropic": + from anthropic import Anthropic + import autogen.oai.anthropic as _anthropic_module + _original_init = _anthropic_module.AnthropicClient.__init__ + def _patched_init(self, **kwargs): + base_url = kwargs.pop("base_url", None) + default_headers = kwargs.pop("default_headers", None) + _original_init(self, **kwargs) + if self._api_key is not None and (base_url or default_headers): + ctor_kwargs = {"api_key": self._api_key} + if base_url: + ctor_kwargs["base_url"] = base_url + if default_headers: + ctor_kwargs["default_headers"] = default_headers + self._client = Anthropic(**ctor_kwargs) + _anthropic_module.AnthropicClient.__init__ = _patched_init + + +def _parse_custom_headers(header_str): + """Parse custom headers in 'key: value' format, separated by newlines or commas.""" + if not header_str: + return None + headers = {} + for line in header_str.replace(",", "\n").split("\n"): + line = line.strip() + if ": " in line: + k, v = line.split(": ", 1) + headers[k.strip()] = v.strip() + return headers or None + + +def _require_env(name, fallback_name=None): + val = os.environ.get(name) + if not val and fallback_name: + val = os.environ.get(fallback_name) + if not val: + sys.exit(f"ERROR: Set {name} (or {fallback_name}) environment variable.") + return val + + +def _build_config(role): + """Build an AutoGen LLM config for the given role (explorer or frontier).""" + prefix = "ICF_EXPLORER" if role == "explorer" else "ICF_FRONTIER" + + if API_TYPE == "openai": + api_key = os.environ.get(f"{prefix}_API_KEY", "unused") + base_url = _require_env(f"{prefix}_BASE_URL") + model = os.environ.get(f"{prefix}_MODEL", "gptoss-20b-hedp") + entry = {"model": model, "api_key": api_key, "base_url": base_url} + else: + api_key = _require_env(f"{prefix}_API_KEY", "ANTHROPIC_API_KEY") + base_url = _require_env(f"{prefix}_BASE_URL", "ANTHROPIC_BASE_URL") + model = os.environ.get(f"{prefix}_MODEL", "Claude-Sonnet-4.5") + headers = _parse_custom_headers( + os.environ.get(f"{prefix}_CUSTOM_HEADERS", os.environ.get("ANTHROPIC_CUSTOM_HEADERS", "")) + ) + entry = {"model": model, "api_key": api_key, "base_url": base_url, "api_type": "anthropic"} + if headers: + entry["default_headers"] = headers + + temp = 0.7 if role == "explorer" else 0.3 + return {"config_list": [entry], "temperature": temp} + + +config_explorer = _build_config("explorer") +config_frontier = _build_config("frontier") +if API_TYPE == "openai": + for cfg in [config_explorer, config_frontier]: + cfg["config_list"][0]["price"] = [0, 0] +print(f"API backend: {API_TYPE} | Explorer model: {config_explorer['config_list'][0]['model']} | Frontier model: {config_frontier['config_list'][0]['model']}") + +# --- MCP client implementation --- +def call_mcp_icf_server(R0: float, v0: float, T0: float, M_sh: float, M_hs: float, delta: float, mode: float, roughness: float) -> str: + """Synchronous wrapper to launch the MCP Client and ping the FastMCP Server.""" + async def _run_mcp_client(): + _dir = os.path.dirname(os.path.abspath(__file__)) + server_params = StdioServerParameters( + command=sys.executable, + args=[os.path.join(_dir, "icf_mcp_server.py")] + ) + async with stdio_client(server_params) as (read, write): + async with ClientSession(read, write) as session: + await session.initialize() + result = await session.call_tool( + "run_icf_implosion", + arguments={ + "R0": R0, "v0": v0, "T0": T0, "M_sh": M_sh, "M_hs": M_hs, + "delta": delta, "mode": mode, "roughness": roughness + } + ) + return result.content[0].text + + return asyncio.run(_run_mcp_client()) + +# --- Agent Definitions --- + +user_proxy = autogen.UserProxyAgent( + name="User_Proxy", + human_input_mode="NEVER", + max_consecutive_auto_reply=8, + code_execution_config=False, + system_message="You are the execution bridge. When the Principal_Investigator calls run_icf_implosion, you execute it and return the results. Do not modify parameters or interpret results." +) + +_PI_SYSTEM_BASE = """\ +You are the Principal Investigator leading an ICF capsule design campaign on a NIF-class 3 MJ laser. + +IMPORTANT: This is a DECELERATION-PHASE surrogate model. R0 is the shell radius at the START OF +STAGNATION (after the laser drive is off), NOT the initial fabricated capsule radius. +All parameters MUST be in SI units using scientific notation (e.g. 1.5e-4, not 150). + +UNITS: All parameters are SI EXCEPT T0 which is in keV (not Kelvin, not eV). + T0=1.0 means 1.0 keV. Do NOT convert to eV or Kelvin. + +KNOWN-GOOD REFERENCE (produces ~7 MJ yield with no defects): + R0=1.5e-4 m, v0=-4.5e5 m/s, T0=1.0 keV, M_sh=2.5e-7 kg, M_hs=5e-9 kg + +PROTOCOL — follow this turn order strictly: +1. Address Design_Explorer by name and ask for capsule parameters. WAIT for their response. +2. After receiving the Explorer's parameters, VALIDATE the energy constraint: + KE = 0.5 * M_sh * v0^2 must be close to 0.015 * 3e6 = 45000 J. + If violated, ask the Explorer to revise. Do NOT proceed until KE ≈ 45 kJ. +3. Address Defect_Adversary by name and ask for defect parameters. WAIT for their response. +4. After receiving BOTH sets of parameters, request a simulation run. + Do NOT propose parameters yourself — delegate to the specialists. +5. Evaluate results: + - Yield > 1 MJ = successful ignition + - Stagnation pressure > 100 Gbar = good confinement + - RT amplification < 1000x = acceptable stability +6. Report results and start the next round if needed. + +STOPPING CRITERIA: + Track the best yield from each round. Stop the campaign when EITHER: + a) The yield improvement between the current best and the previous best is < 5% for + 2 consecutive rounds (the design has converged — further iteration is unlikely to help). + b) You have completed 6 rounds (hard cap to prevent runaway optimization). + At the end of each round, report: "Round N: Yield = X.XX MJ (best so far: Y.YY MJ, change: +Z.Z%)" + When stopping, summarize the best design found, its parameters, and its robustness to defects. +End your final summary with TERMINATE.""" + +if API_TYPE == "anthropic": + _PI_TOOL_INSTR = """ + +You are the ONLY agent that can call the run_icf_implosion tool. The other agents cannot run simulations. +When you have all 8 parameters, call the run_icf_implosion tool directly.""" +else: + _PI_TOOL_INSTR = """ + +When you have all 8 parameters and want to run the simulation, output EXACTLY this format: +RUN_SIMULATION: R0=, v0=, T0=, M_sh=, M_hs=, delta=, mode=, roughness= +The User_Proxy will parse this, run the simulation, and return results.""" + +principal_investigator = autogen.AssistantAgent( + name="Principal_Investigator", + llm_config=config_frontier, + system_message=_PI_SYSTEM_BASE + _PI_TOOL_INSTR, +) + +explorer_agent = autogen.AssistantAgent( + name="Design_Explorer", + llm_config=config_explorer, + system_message="""\ +You are the ICF Design Explorer. You propose capsule parameters to maximize fusion yield. +You CANNOT call tools or run simulations. You ONLY output parameter proposals for the +Principal_Investigator to simulate. + +IMPORTANT: This is a DECELERATION-PHASE surrogate. R0 is the shell radius at the start of +stagnation (~100-200 um), NOT the initial fabricated capsule outer radius (~1 mm). + +ALL VALUES MUST USE SCIENTIFIC NOTATION (e.g. 1.5e-4, not 150e-6 or 0.00015). + +ENERGY CONSTRAINT (mandatory): + KE = 0.5 * M_sh * v0^2 = 0.015 * 3e6 = 45000 J + Show your KE calculation with every proposal. + +PARAMETERS: + R0 [m] deceleration-phase radius. Range: 8e-5 to 2.5e-4. Example: 1.5e-4 + v0 [m/s] implosion velocity (negative). Range: -7e5 to -3e5. Example: -4.5e5 + T0 [keV] initial hotspot temperature. Range: 0.5 to 3.0. Example: 1.0 + NOTE: T0 is in keV, NOT Kelvin and NOT eV. Just use the number (e.g. 1.2). + M_sh [kg] shell mass. Range: 5e-8 to 1e-6. Example: 2.5e-7 + M_hs [kg] initial hotspot mass. Range: 1e-9 to 5e-8. Example: 5e-9 + +KNOWN-GOOD BASELINE (yields ~7 MJ): + R0=1.5e-4, v0=-4.5e5, T0=1.0, M_sh=2.5e-7, M_hs=5e-9 + KE = 0.5 * 2.5e-7 * (4.5e5)^2 = 25312 J (uses 56% of budget — room to optimize) + +Reply with ONLY your 5 parameter values and KE check. Keep it brief.""" +) + +adversary_agent = autogen.AssistantAgent( + name="Defect_Adversary", + llm_config=config_frontier, + system_message="""\ +You are the Defect_Adversary. Your ONLY job is to propose 3 defect parameter values. +Do NOT coordinate other agents. Do NOT discuss design parameters. Do NOT role-play as the PI. +You CANNOT call tools or run simulations. + +When the Principal_Investigator asks you for defects, respond with ONLY: + delta = + mode = + roughness = + Rationale: + +PARAMETER BOUNDS (server-enforced, values outside will be clamped): + delta [0.0, 0.15] mode-1 asymmetry. Typical: 0.02-0.05. + mode [2, 40] RT mode number. Typical: 10-20. + roughness [0, 3e-6] surface roughness [m]. Typical: 1e-7 to 1e-6. + +STRATEGY — vary defects across rounds: + Round 1: moderate asymmetry (delta~0.04), low mode (~10), typical roughness (~5e-7). + Round 2: low asymmetry (delta~0.01), high mode (~30), roughness (~2e-6). + Round 3: combine whatever was most damaging.""" +) + +if API_TYPE == "anthropic": + autogen.agentchat.register_function( + call_mcp_icf_server, + caller=principal_investigator, + executor=user_proxy, + name="run_icf_implosion", + description="Runs the ICF deceleration surrogate via MCP. Requires 8 float parameters." + ) +else: + import re + def _auto_execute_simulation(sender, message, recipient, silent): + content = message.get("content", "") if isinstance(message, dict) else str(message) + match = re.search(r"RUN_SIMULATION:\s*(.+)", content) + if not match: + return message + param_str = match.group(1) + params = {} + for pair in re.findall(r"(\w+)\s*=\s*([^\s,]+)", param_str): + try: + params[pair[0]] = float(pair[1]) + except ValueError: + pass + required = ["R0", "v0", "T0", "M_sh", "M_hs", "delta", "mode", "roughness"] + if all(k in params for k in required): + result = call_mcp_icf_server(**{k: params[k] for k in required}) + content += "\n\n--- SIMULATION RESULTS ---\n" + result + else: + content += f"\n\nERROR: Missing parameters. Got: {list(params.keys())}. Need: {required}" + if isinstance(message, dict): + message["content"] = content + else: + message = content + return message + + principal_investigator.register_hook("process_message_before_send", _auto_execute_simulation) + +# --- Gradio Interface --- +def chat_with_swarm(user_message: str, history: list): + if API_TYPE == "anthropic": + agents = [user_proxy, principal_investigator, explorer_agent, adversary_agent] + allowed_transitions = { + user_proxy: [principal_investigator], + principal_investigator: [explorer_agent, adversary_agent, user_proxy], + explorer_agent: [principal_investigator], + adversary_agent: [principal_investigator], + } + else: + agents = [user_proxy, principal_investigator, explorer_agent, adversary_agent] + allowed_transitions = { + user_proxy: [principal_investigator], + principal_investigator: [explorer_agent, adversary_agent], + explorer_agent: [principal_investigator], + adversary_agent: [principal_investigator], + } + groupchat = autogen.GroupChat( + agents=agents, + messages=[], + max_round=30, + allowed_or_disallowed_speaker_transitions=allowed_transitions, + speaker_transitions_type="allowed", + ) + manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=config_frontier) + + chat_error = [] + done = threading.Event() + + def _run_chat(): + try: + user_proxy.initiate_chat( + manager, + message=f"USER REQUEST: {user_message}. Principal_Investigator, please coordinate the swarm to find a robust design." + ) + except Exception as e: + chat_error.append(str(e)) + finally: + done.set() + + thread = threading.Thread(target=_run_chat, daemon=True) + thread.start() + + seen = 0 + accumulated = "" + while not done.is_set(): + msgs = groupchat.messages + if len(msgs) > seen: + for msg in msgs[seen:]: + name = msg.get("name", "System") + content = msg.get("content", "") + if content: + accumulated += f"\n\n---\n**{name}:**\n{content}" + yield accumulated.strip() + seen = len(msgs) + else: + time.sleep(0.5) + + for msg in groupchat.messages[seen:]: + name = msg.get("name", "System") + content = msg.get("content", "") + if content: + accumulated += f"\n\n---\n**{name}:**\n{content}" + yield accumulated.strip() + + thread.join(timeout=5) + + if chat_error: + accumulated += f"\n\n---\n**ERROR:** {chat_error[0]}" + yield accumulated.strip() + +if __name__ == "__main__": + demo = gr.ChatInterface( + fn=chat_with_swarm, + title="Agentic RL Multi-Agent Fusion Capsule Optimizer", + ) + demo.launch(server_name="0.0.0.0", server_port=7860, share=True) diff --git a/MLExamples/icf_4agent/chatml_simple.jinja b/MLExamples/icf_4agent/chatml_simple.jinja new file mode 100644 index 00000000..cf80c0fa --- /dev/null +++ b/MLExamples/icf_4agent/chatml_simple.jinja @@ -0,0 +1,8 @@ +{% for message in messages %}{% if message['role'] == 'system' %}<|im_start|>system +{{ message['content'] }}<|im_end|> +{% elif message['role'] == 'user' %}<|im_start|>user +{{ message['content'] }}<|im_end|> +{% elif message['role'] == 'assistant' %}<|im_start|>assistant +{{ message['content'] }}<|im_end|> +{% endif %}{% endfor %}{% if add_generation_prompt %}<|im_start|>assistant +{% endif %} \ No newline at end of file diff --git a/MLExamples/icf_4agent/create_aivenv.sh b/MLExamples/icf_4agent/create_aivenv.sh new file mode 100755 index 00000000..7d52d277 --- /dev/null +++ b/MLExamples/icf_4agent/create_aivenv.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +set -e + +ROCMVERSION=7.2.2 +module load rocm/$ROCMVERSION + +python3 -m venv aivenv --system-site-packages +source aivenv/bin/activate + +python -m pip install --upgrade pip +python -m pip install -r requirements.txt + diff --git a/MLExamples/icf_4agent/docs/IEEEtran.cls b/MLExamples/icf_4agent/docs/IEEEtran.cls new file mode 100644 index 00000000..8d2b1c64 --- /dev/null +++ b/MLExamples/icf_4agent/docs/IEEEtran.cls @@ -0,0 +1,6347 @@ +%% +%% IEEEtran.cls 2015/08/26 version V1.8b +%% +%% This is the IEEEtran LaTeX class for authors of the Institute of +%% Electrical and Electronics Engineers (IEEE) Transactions journals and +%% conferences. +%% +%% Support sites: +%% http://www.michaelshell.org/tex/ieeetran/ +%% http://www.ctan.org/pkg/ieeetran +%% and +%% http://www.ieee.org/ +%% +%% Based on the original 1993 IEEEtran.cls, but with many bug fixes +%% and enhancements (from both JVH and MDS) over the 1996/7 version. +%% +%% +%% Contributors: +%% Gerry Murray (1993), Silvano Balemi (1993), +%% Jon Dixon (1996), Peter N"uchter (1996), +%% Juergen von Hagen (2000), and Michael Shell (2001-2014) +%% +%% +%% Copyright (c) 1993-2000 by Gerry Murray, Silvano Balemi, +%% Jon Dixon, Peter N"uchter, +%% Juergen von Hagen +%% and +%% Copyright (c) 2001-2015 by Michael Shell +%% +%% Current maintainer (V1.3 to V1.8b): Michael Shell +%% See: +%% http://www.michaelshell.org/ +%% for current contact information. +%% +%% Special thanks to Peter Wilson (CUA) and Donald Arseneau +%% for allowing the inclusion of the \@ifmtarg command +%% from their ifmtarg LaTeX package. +%% +%%************************************************************************* +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall the IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%% +%% This work is distributed under the LaTeX Project Public License (LPPL) +%% ( http://www.latex-project.org/ ) version 1.3, and may be freely used, +%% distributed and modified. A copy of the LPPL, version 1.3, is included +%% in the base LaTeX documentation of all distributions of LaTeX released +%% 2003/12/01 or later. +%% Retain all contribution notices and credits. +%% ** Modified files should be clearly indicated as such, including ** +%% ** renaming them and changing author support contact information. ** +%% +%% File list of work: IEEEtran.cls, IEEEtran_HOWTO.pdf, bare_adv.tex, +%% bare_conf.tex, bare_jrnl.tex, bare_conf_compsoc.tex, +%% bare_jrnl_compsoc.tex +%% +%% Major changes to the user interface should be indicated by an +%% increase in the version numbers. If a version is a beta, it will +%% be indicated with a BETA suffix, i.e., 1.4 BETA. +%% Small changes can be indicated by appending letters to the version +%% such as "IEEEtran_v14a.cls". +%% In all cases, \Providesclass, any \typeout messages to the user, +%% \IEEEtransversionmajor and \IEEEtransversionminor must reflect the +%% correct version information. +%% The changes should also be documented via source comments. +%%************************************************************************* +%% +% +% Available class options +% e.g., \documentclass[10pt,conference]{IEEEtran} +% +% *** choose only one from each category *** +% +% 9pt, 10pt, 11pt, 12pt +% Sets normal font size. The default is 10pt. +% +% conference, journal, technote, peerreview, peerreviewca +% determines format mode - conference papers, journal papers, +% correspondence papers (technotes), or peer review papers. The user +% should also select 9pt when using technote. peerreview is like +% journal mode, but provides for a single-column "cover" title page for +% anonymous peer review. The paper title (without the author names) is +% repeated at the top of the page after the cover page. For peer review +% papers, the \IEEEpeerreviewmaketitle command must be executed (will +% automatically be ignored for non-peerreview modes) at the place the +% cover page is to end, usually just after the abstract (keywords are +% not normally used with peer review papers). peerreviewca is like +% peerreview, but allows the author names to be entered and formatted +% as with conference mode so that author affiliation and contact +% information can be easily seen on the cover page. +% The default is journal. +% +% draft, draftcls, draftclsnofoot, final +% determines if paper is formatted as a widely spaced draft (for +% handwritten editor comments) or as a properly typeset final version. +% draftcls restricts draft mode to the class file while all other LaTeX +% packages (i.e., \usepackage{graphicx}) will behave as final - allows +% for a draft paper with visible figures, etc. draftclsnofoot is like +% draftcls, but does not display the date and the word "DRAFT" at the foot +% of the pages. If using one of the draft modes, the user will probably +% also want to select onecolumn. +% The default is final. +% +% letterpaper, a4paper, cspaper +% determines paper size: 8.5in X 11in, 210mm X 297mm or 7.875in X 10.75in. +% Changing the paper size in the standard journal and conference modes +% will not alter the typesetting of the document - only the margins will +% be affected. In particular, documents using the a4paper option will +% have reduced side margins (A4 is narrower than US letter) and a longer +% bottom margin (A4 is longer than US letter). For both cases, the top +% margins will be the same and the text will be horizontally centered. +% For the compsoc conference and draft modes, it is the margins that will +% remain constant, and thus the text area size will vary, with changes in +% the paper size. +% The cspaper option is the special ``trim'' paper size (7.875in x 10.75in) +% used in the actual publication of Computer Society journals. Under +% compsoc journal mode, this option does not alter the typesetting of the +% document. Authors should invoke the cspaper option only if requested to +% do so by the editors of the specific journal they are submitting to. +% For final submission to the IEEE, authors should generally use US letter +% (8.5 X 11in) paper unless otherwise instructed. Note that authors should +% ensure that all post-processing (ps, pdf, etc.) uses the same paper +% specificiation as the .tex document. Problems here are by far the number +% one reason for incorrect margins. IEEEtran will automatically set the +% default paper size under pdflatex (without requiring any change to +% pdftex.cfg), so this issue is more important to dvips users. Fix +% config.ps, config.pdf, or ~/.dvipsrc for dvips, or use the +% dvips -t papersize option instead as needed. For the cspaper option, +% the corresponding dvips paper name is "ieeecs". +% See the testflow documentation +% http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/testflow +% for more details on dvips paper size configuration. +% The default is letterpaper. +% +% oneside, twoside +% determines if layout follows single sided or two sided (duplex) +% printing. The only notable change is with the headings at the top of +% the pages. +% The default is oneside. +% +% onecolumn, twocolumn +% determines if text is organized into one or two columns per page. One +% column mode is usually used only with draft papers. +% The default is twocolumn. +% +% comsoc, compsoc, transmag +% Use the format of the IEEE Communications Society, IEEE Computer Society +% or IEEE Transactions on Magnetics, respectively. +% +% romanappendices +% Use the "Appendix I" convention when numbering appendices. IEEEtran.cls +% now defaults to Alpha "Appendix A" convention - the opposite of what +% v1.6b and earlier did. +% +% captionsoff +% disables the display of the figure/table captions. Some IEEE journals +% request that captions be removed and figures/tables be put on pages +% of their own at the end of an initial paper submission. The endfloat +% package can be used with this class option to achieve this format. +% +% nofonttune +% turns off tuning of the font interword spacing. Maybe useful to those +% not using the standard Times fonts or for those who have already "tuned" +% their fonts. +% The default is to enable IEEEtran to tune font parameters. +% +% +%---------- +% Available CLASSINPUTs provided (all are macros unless otherwise noted): +% \CLASSINPUTbaselinestretch +% \CLASSINPUTinnersidemargin +% \CLASSINPUToutersidemargin +% \CLASSINPUTtoptextmargin +% \CLASSINPUTbottomtextmargin +% +% Available CLASSINFOs provided: +% \ifCLASSINFOpdf (TeX if conditional) +% \CLASSINFOpaperwidth (macro) +% \CLASSINFOpaperheight (macro) +% \CLASSINFOnormalsizebaselineskip (length) +% \CLASSINFOnormalsizeunitybaselineskip (length) +% +% Available CLASSOPTIONs provided: +% all class option flags (TeX if conditionals) unless otherwise noted, +% e.g., \ifCLASSOPTIONcaptionsoff +% point size options provided as a single macro: +% \CLASSOPTIONpt +% which will be defined as 9, 10, 11, or 12 depending on the document's +% normalsize point size. +% also, class option peerreviewca implies the use of class option peerreview +% and classoption draft implies the use of class option draftcls + + + + + +\ProvidesClass{IEEEtran}[2015/08/26 V1.8b by Michael Shell] +\typeout{-- See the "IEEEtran_HOWTO" manual for usage information.} +\typeout{-- http://www.michaelshell.org/tex/ieeetran/} +\NeedsTeXFormat{LaTeX2e} + +% IEEEtran.cls version numbers, provided as of V1.3 +% These values serve as a way a .tex file can +% determine if the new features are provided. +% The version number of this IEEEtrans.cls can be obtained from +% these values. i.e., V1.4 +% KEEP THESE AS INTEGERS! i.e., NO {4a} or anything like that- +% (no need to enumerate "a" minor changes here) +\def\IEEEtransversionmajor{1} +\def\IEEEtransversionminor{8} + + +% hook to allow easy changeover to IEEEtran.cls/tools.sty error reporting +\def\@IEEEclspkgerror{\ClassError{IEEEtran}} + + +% These do nothing, but provide them like in article.cls +\newif\if@restonecol +\newif\if@titlepage + + +% class option conditionals +\newif\ifCLASSOPTIONonecolumn \CLASSOPTIONonecolumnfalse +\newif\ifCLASSOPTIONtwocolumn \CLASSOPTIONtwocolumntrue + +\newif\ifCLASSOPTIONoneside \CLASSOPTIONonesidetrue +\newif\ifCLASSOPTIONtwoside \CLASSOPTIONtwosidefalse + +\newif\ifCLASSOPTIONfinal \CLASSOPTIONfinaltrue +\newif\ifCLASSOPTIONdraft \CLASSOPTIONdraftfalse +\newif\ifCLASSOPTIONdraftcls \CLASSOPTIONdraftclsfalse +\newif\ifCLASSOPTIONdraftclsnofoot \CLASSOPTIONdraftclsnofootfalse + +\newif\ifCLASSOPTIONpeerreview \CLASSOPTIONpeerreviewfalse +\newif\ifCLASSOPTIONpeerreviewca \CLASSOPTIONpeerreviewcafalse + +\newif\ifCLASSOPTIONjournal \CLASSOPTIONjournaltrue +\newif\ifCLASSOPTIONconference \CLASSOPTIONconferencefalse +\newif\ifCLASSOPTIONtechnote \CLASSOPTIONtechnotefalse + +\newif\ifCLASSOPTIONnofonttune \CLASSOPTIONnofonttunefalse + +\newif\ifCLASSOPTIONcaptionsoff \CLASSOPTIONcaptionsofffalse + +\newif\ifCLASSOPTIONcomsoc \CLASSOPTIONcomsocfalse +\newif\ifCLASSOPTIONcompsoc \CLASSOPTIONcompsocfalse +\newif\ifCLASSOPTIONtransmag \CLASSOPTIONtransmagfalse + +\newif\ifCLASSOPTIONromanappendices \CLASSOPTIONromanappendicesfalse + + +% class info conditionals + +% indicates if pdf (via pdflatex) output +\newif\ifCLASSINFOpdf \CLASSINFOpdffalse + + +% V1.6b internal flag to show if using a4paper +\newif\if@IEEEusingAfourpaper \@IEEEusingAfourpaperfalse +% V1.6b internal flag to show if using cspaper +\newif\if@IEEEusingcspaper \@IEEEusingcspaperfalse + + +% IEEEtran class scratch pad registers +% dimen +\newdimen\@IEEEtrantmpdimenA +\newdimen\@IEEEtrantmpdimenB +\newdimen\@IEEEtrantmpdimenC +% count +\newcount\@IEEEtrantmpcountA +\newcount\@IEEEtrantmpcountB +\newcount\@IEEEtrantmpcountC +% token list +\newtoks\@IEEEtrantmptoksA + +% we use \CLASSOPTIONpt so that we can ID the point size (even for 9pt docs) +% as well as LaTeX's \@ptsize to retain some compatability with some +% external packages +\def\@ptsize{0} +% LaTeX does not support 9pt, so we set \@ptsize to 0 - same as that of 10pt +\DeclareOption{9pt}{\def\CLASSOPTIONpt{9}\def\@ptsize{0}} +\DeclareOption{10pt}{\def\CLASSOPTIONpt{10}\def\@ptsize{0}} +\DeclareOption{11pt}{\def\CLASSOPTIONpt{11}\def\@ptsize{1}} +\DeclareOption{12pt}{\def\CLASSOPTIONpt{12}\def\@ptsize{2}} + + + +\DeclareOption{letterpaper}{\setlength{\paperwidth}{8.5in}% + \setlength{\paperheight}{11in}% + \@IEEEusingAfourpaperfalse + \@IEEEusingcspaperfalse + \def\CLASSOPTIONpaper{letter}% + \def\CLASSINFOpaperwidth{8.5in}% + \def\CLASSINFOpaperheight{11in}} + + +\DeclareOption{a4paper}{\setlength{\paperwidth}{210mm}% + \setlength{\paperheight}{297mm}% + \@IEEEusingAfourpapertrue + \@IEEEusingcspaperfalse + \def\CLASSOPTIONpaper{a4}% + \def\CLASSINFOpaperwidth{210mm}% + \def\CLASSINFOpaperheight{297mm}} + +% special paper option for compsoc journals +\DeclareOption{cspaper}{\setlength{\paperwidth}{7.875in}% + \setlength{\paperheight}{10.75in}% + \@IEEEusingcspapertrue + \@IEEEusingAfourpaperfalse + \def\CLASSOPTIONpaper{ieeecs}% + \def\CLASSINFOpaperwidth{7.875in}% + \def\CLASSINFOpaperheight{10.75in}} + +\DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse + \CLASSOPTIONonesidetrue\CLASSOPTIONtwosidefalse} +\DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue + \CLASSOPTIONtwosidetrue\CLASSOPTIONonesidefalse} + +\DeclareOption{onecolumn}{\CLASSOPTIONonecolumntrue\CLASSOPTIONtwocolumnfalse} +\DeclareOption{twocolumn}{\CLASSOPTIONtwocolumntrue\CLASSOPTIONonecolumnfalse} + +% If the user selects draft, then this class AND any packages +% will go into draft mode. +\DeclareOption{draft}{\CLASSOPTIONdrafttrue\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofootfalse} +% draftcls is for a draft mode which will not affect any packages +% used by the document. +\DeclareOption{draftcls}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofootfalse} +% draftclsnofoot is like draftcls, but without the footer. +\DeclareOption{draftclsnofoot}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofoottrue} +\DeclareOption{final}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclsfalse + \CLASSOPTIONdraftclsnofootfalse} + +\DeclareOption{journal}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournaltrue\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{conference}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencetrue\CLASSOPTIONtechnotefalse} + +\DeclareOption{technote}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotetrue} + +\DeclareOption{peerreview}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{peerreviewca}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcatrue + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{nofonttune}{\CLASSOPTIONnofonttunetrue} + +\DeclareOption{captionsoff}{\CLASSOPTIONcaptionsofftrue} + +\DeclareOption{comsoc}{\CLASSOPTIONcomsoctrue\CLASSOPTIONcompsocfalse\CLASSOPTIONtransmagfalse} + +\DeclareOption{compsoc}{\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsoctrue\CLASSOPTIONtransmagfalse} + +\DeclareOption{transmag}{\CLASSOPTIONtransmagtrue\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsocfalse} + +\DeclareOption{romanappendices}{\CLASSOPTIONromanappendicestrue} + + +% default to US letter paper, 10pt, twocolumn, one sided, final, journal +\ExecuteOptions{letterpaper,10pt,twocolumn,oneside,final,journal} +% overrride these defaults per user requests +\ProcessOptions + + + +%% -- Command Argument Scanning Support Functions -- + +% Sets the category codes for punctuation to their normal values. +% For local use with argument scanning. +\def\IEEEnormalcatcodespunct{\catcode`\!=12 \catcode`\,=12 \catcode`\:=12 +\catcode`\;=12 \catcode`\`=12 \catcode`\'=12 \catcode`\"=12 \catcode`\.=12 +\catcode`\/=12 \catcode`\?=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12 +\catcode`\<=12 \catcode`\>=12 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12 +\catcode`\]=12 \catcode`\==12 \catcode`\|=12} +% Sets the category codes for numbers to their normal values. +% For local use with argument scanning. +\def\IEEEnormalcatcodesnum{\catcode`\0=12 \catcode`\1=12 \catcode`\2=12 +\catcode`\3=12 \catcode`\4=12 \catcode`\5=12 \catcode`\6=12 \catcode`\7=12 +\catcode`\8=12 \catcode`\9=12} +% combined action of \IEEEnormalcatcodespunct and \IEEEnormalcatcodesnum +\def\IEEEnormalcatcodes{\IEEEnormalcatcodespunct\IEEEnormalcatcodesnum} + + +% usage: \@IEEEextracttoken*{} +% \@IEEEextracttoken fully expands its argument (which it then stores in +% \@IEEEextracttokenarg) via \edef and then the meaning of the first +% nonbrace (but including the empty group) token found is assigned via \let +% to \@IEEEextractedtoken as well as stored in the macro +% \@IEEEextractedtokenmacro. Tokens that would otherwise be discarded during +% the acquisition of the first are stored in \@IEEEextractedtokensdiscarded, +% however their original relative brace nesting depths are not guaranteed to +% be preserved. +% If the argument is empty, or if a first nonbrace token does not exist (or +% is an empty group), \@IEEEextractedtoken will be \relax and +% \@IEEEextractedtokenmacro and \@IEEEextractedtokensdiscarded will be empty. +% +% For example: +% \@IEEEextracttoken{{{ab}{cd}}{{ef}g}} +% results in: +% +% \@IEEEextracttokenarg ==> a macro containing {{ab}{cd}}{{ef}g} +% \@IEEEextractedtoken ==> the letter a +% \@IEEEextractedtokenmacro ==> a macro containing a +% \@IEEEextractedtokensdiscarded ==> a macro containing bcd{ef}g +% +% the *-star form, \@IEEEextracttoken*, does not expand its argument +% contents during processing. +\def\@IEEEextracttoken{\@ifstar{\let\@IEEEextracttokendef=\def\@@IEEEextracttoken}{\let\@IEEEextracttokendef=\edef\@@IEEEextracttoken}} + +\def\@@IEEEextracttoken#1{\@IEEEextracttokendef\@IEEEextracttokenarg{#1}\relax +\def\@IEEEextractedtokensdiscarded{}\relax % initialize to empty +% if the macro is unchanged after being acquired as a single undelimited argument +% with anything after it being stripped off as a delimited argument +% we know we have one token without any enclosing braces. loop until this is true. +\let\@IEEEextracttokencurgroup\@IEEEextracttokenarg +\loop + % trap case of an empty argument as this would cause a problem with + % \@@@IEEEextracttoken's first (nondelimited) argument acquisition + \ifx\@IEEEextracttokencurgroup\@empty + \def\@IEEEextractedtokenmacro{}\relax + \else + \expandafter\@@@IEEEextracttoken\@IEEEextracttokencurgroup\@IEEEgeneralsequenceDELIMITER\relax + \fi + \ifx\@IEEEextractedtokenmacro\@IEEEextracttokencurgroup + \else + \let\@IEEEextracttokencurgroup=\@IEEEextractedtokenmacro +\repeat +% we can safely do a \let= here because there should be at most one token +% the relax is needed to handle the case of no token found +\expandafter\let\expandafter\@IEEEextractedtoken\@IEEEextractedtokenmacro\relax} + +\def\@@@IEEEextracttoken#1#2\@IEEEgeneralsequenceDELIMITER{\def\@IEEEextractedtokenmacro{#1}\relax +\def\@@IEEEextractedtokensdiscarded{#2}\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter +\@IEEEextractedtokensdiscarded\expandafter\expandafter\expandafter +{\expandafter\@@IEEEextractedtokensdiscarded\@IEEEextractedtokensdiscarded}} +%% +%% -- End of Command Argument Scanning Support Functions -- + + + +% Computer Society conditional execution command +\long\def\@IEEEcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\relax#1\relax\fi\relax} +% inverse +\long\def\@IEEEnotcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\else\relax#1\relax\fi\relax} +% compsoc conference +\long\def\@IEEEcompsocconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\relax#1\relax\fi\fi\relax} +% compsoc not conference +\long\def\@IEEEcompsocnotconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\else\relax#1\relax\fi\fi\relax} + + +% comsoc verify that newtxmath, mtpro2, mt11p or mathtime has been loaded +\def\@IEEEcomsocverifymathfont{\typeout{-- Verifying Times compatible math font.}\relax + \@ifpackageloaded{newtxmath}{\typeout{-- newtxmath loaded, OK.}}{\@@IEEEcomsocverifymathfont}} +\def\@@IEEEcomsocverifymathfont{\@ifpackageloaded{mtpro2}{\typeout{-- mtpro2 loaded, OK.}}{\@@@IEEEcomsocverifymathfont}} +\def\@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mt11p}{\typeout{-- mt11p2 loaded, OK.}}{\@@@@IEEEcomsocverifymathfont}} +\def\@@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mathtime}{\typeout{-- mathtime loaded, OK.}}{\@IEEEcomsocenforcemathfont}} + +% comsoc, if a Times math font was not loaded by user, enforce it +\def\@IEEEcomsocenforcemathfont{\typeout{** Times compatible math font not found, forcing.}\relax +\IfFileExists{newtxmath.sty}{\typeout{-- Found newtxmath, loading.}\RequirePackage{newtxmath}}{\@@IEEEcomsocenforcemathfont}} +\def\@@IEEEcomsocenforcemathfont{\IfFileExists{mtpro2.sty}{\typeout{-- Found mtpro2, loading.}\RequirePackage{mtpro2}}{\@@@IEEEcomsocenforcemathfont}} +\def\@@@IEEEcomsocenforcemathfont{\IfFileExists{mt11p.sty}{\typeout{-- Found mt11p, loading.}\RequirePackage{mt11p}}{\@@@@IEEEcomsocenforcemathfont}} +\def\@@@@IEEEcomsocenforcemathfont{\IfFileExists{mathtime.sty}{\typeout{-- Found mathtime, loading.}\RequirePackage{mathtime}}{\@@@@@IEEEcomsocenforcemathfont}} +% if no acceptable Times math font package found, error with newtxmath requirement +\def\@@@@@IEEEcomsocenforcemathfont{\typeout{** No Times compatible math font package found. newtxmath is required.}\RequirePackage{newtxmath}} + + +\ifCLASSOPTIONcomsoc + % ensure that if newtxmath is used, the cmintegrals option is also invoked + \PassOptionsToPackage{cmintegrals}{newtxmath} + % comsoc requires a Times like math font + % ensure this requirement is satisfied at document start + \AtBeginDocument{\@IEEEcomsocverifymathfont} +\fi + + + +% The IEEE uses Times Roman font, so we'll default to Times. +% These three commands make up the entire times.sty package. +\renewcommand{\sfdefault}{phv} +\renewcommand{\rmdefault}{ptm} +\renewcommand{\ttdefault}{pcr} + +% V1.7 compsoc nonconference papers, use Palatino/Palladio as the main text font, +% not Times Roman. +\@IEEEcompsocnotconfonly{\renewcommand{\rmdefault}{ppl}} + +% enable the selected main text font +\normalfont\selectfont + + +\ifCLASSOPTIONcomsoc + \typeout{-- Using IEEE Communications Society mode.} +\fi + +\ifCLASSOPTIONcompsoc + \typeout{-- Using IEEE Computer Society mode.} +\fi + + +% V1.7 conference notice message hook +\def\@IEEEconsolenoticeconference{\typeout{}% +\typeout{** Conference Paper **}% +\typeout{Before submitting the final camera ready copy, remember to:}% +\typeout{}% +\typeout{ 1. Manually equalize the lengths of two columns on the last page}% +\typeout{ of your paper;}% +\typeout{}% +\typeout{ 2. Ensure that any PostScript and/or PDF output post-processing}% +\typeout{ uses only Type 1 fonts and that every step in the generation}% +\typeout{ process uses the appropriate paper size.}% +\typeout{}} + + +% we can send console reminder messages to the user here +\AtEndDocument{\ifCLASSOPTIONconference\@IEEEconsolenoticeconference\fi} + + +% warn about the use of single column other than for draft mode +\ifCLASSOPTIONtwocolumn\else% + \ifCLASSOPTIONdraftcls\else% + \typeout{** ATTENTION: Single column mode is not typically used with IEEE publications.}% + \fi% +\fi + + +% V1.7 improved paper size setting code. +% Set pdfpage and dvips paper sizes. Conditional tests are similar to that +% of ifpdf.sty. Retain within {} to ensure tested macros are never altered, +% even if only effect is to set them to \relax. +% if \pdfoutput is undefined or equal to relax, output a dvips special +{\@ifundefined{pdfoutput}{\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}}{% +% pdfoutput is defined and not equal to \relax +% check for pdfpageheight existence just in case someone sets pdfoutput +% under non-pdflatex. If exists, set them regardless of value of \pdfoutput. +\@ifundefined{pdfpageheight}{\relax}{\global\pdfpagewidth\paperwidth +\global\pdfpageheight\paperheight}% +% if using \pdfoutput=0 under pdflatex, send dvips papersize special +\ifcase\pdfoutput +\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}% +\else +% we are using pdf output, set CLASSINFOpdf flag +\global\CLASSINFOpdftrue +\fi}} + +% let the user know the selected papersize +\typeout{-- Using \CLASSINFOpaperwidth\space x \CLASSINFOpaperheight\space +(\CLASSOPTIONpaper)\space paper.} + +\ifCLASSINFOpdf +\typeout{-- Using PDF output.} +\else +\typeout{-- Using DVI output.} +\fi + + +% The idea hinted here is for LaTeX to generate markleft{} and markright{} +% automatically for you after you enter \author{}, \journal{}, +% \journaldate{}, journalvol{}, \journalnum{}, etc. +% However, there may be some backward compatibility issues here as +% well as some special applications for IEEEtran.cls and special issues +% that may require the flexible \markleft{}, \markright{} and/or \markboth{}. +% We'll leave this as an open future suggestion. +%\newcommand{\journal}[1]{\def\@journal{#1}} +%\def\@journal{} + + + +% pointsize values +% used with ifx to determine the document's normal size +\def\@IEEEptsizenine{9} +\def\@IEEEptsizeten{10} +\def\@IEEEptsizeeleven{11} +\def\@IEEEptsizetwelve{12} + + + +% FONT DEFINITIONS (No sizexx.clo file needed) +% V1.6 revised font sizes, displayskip values and +% revised normalsize baselineskip to reduce underfull vbox problems +% on the 58pc = 696pt = 9.5in text height we want +% normalsize #lines/column baselineskip (aka leading) +% 9pt 63 11.0476pt (truncated down) +% 10pt 58 12pt (exact) +% 11pt 52 13.3846pt (truncated down) +% 12pt 50 13.92pt (exact) +% + +% we need to store the nominal baselineskip for the given font size +% in case baselinestretch ever changes. +% this is a dimen, so it will not hold stretch or shrink +\newdimen\@IEEEnormalsizeunitybaselineskip +\@IEEEnormalsizeunitybaselineskip\baselineskip + + + +%% ******* WARNING! ******* +%% +%% Authors should not alter font sizes, baselineskip ("leading"), +%% margins or other spacing values in an attempt to squeeze more +%% material on each page. +%% +%% The IEEE's own typesetting software will restore the correct +%% values when re-typesetting/proofing the submitted document, +%% possibly resulting in unexpected article over length charges. +%% +%% ******* WARNING! ******* + + +% 9pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\typeout{-- This is a 9 point document.} +\def\normalsize{\@setfontsize{\normalsize}{9}{11.0476pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.0476pt} +\normalsize +\abovedisplayskip 1.5ex plus 3pt minus 1pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 3pt +\belowdisplayshortskip 1.5ex plus 3pt minus 1pt +\def\small{\@setfontsize{\small}{8.5}{10pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}} +\def\tiny{\@setfontsize{\tiny}{5}{6pt}} +% sublargesize is the same as large - 10pt +\def\sublargesize{\@setfontsize{\sublargesize}{10}{12pt}} +\def\large{\@setfontsize{\large}{10}{12pt}} +\def\Large{\@setfontsize{\Large}{12}{14pt}} +\def\LARGE{\@setfontsize{\LARGE}{14}{17pt}} +\def\huge{\@setfontsize{\huge}{17}{20pt}} +\def\Huge{\@setfontsize{\Huge}{20}{24pt}} +\fi +% +% 10pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\typeout{-- This is a 10 point document.} +\def\normalsize{\@setfontsize{\normalsize}{10}{12.00pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{12pt} +\normalsize +\abovedisplayskip 1.5ex plus 4pt minus 2pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4pt +\belowdisplayshortskip 1.5ex plus 4pt minus 2pt +\def\small{\@setfontsize{\small}{9}{10pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}} +\def\tiny{\@setfontsize{\tiny}{5}{6pt}} +% sublargesize is a tad smaller than large - 11pt +\def\sublargesize{\@setfontsize{\sublargesize}{11}{13.4pt}} +\def\large{\@setfontsize{\large}{12}{14pt}} +\def\Large{\@setfontsize{\Large}{14}{17pt}} +\def\LARGE{\@setfontsize{\LARGE}{17}{20pt}} +\def\huge{\@setfontsize{\huge}{20}{24pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi +% +% 11pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\typeout{-- This is an 11 point document.} +\def\normalsize{\@setfontsize{\normalsize}{11}{13.3846pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.3846pt} +\normalsize +\abovedisplayskip 1.5ex plus 5pt minus 3pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5pt +\belowdisplayshortskip 1.5ex plus 5pt minus 3pt +\def\small{\@setfontsize{\small}{10}{12pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}} +\def\tiny{\@setfontsize{\tiny}{6}{7pt}} +% sublargesize is the same as large - 12pt +\def\sublargesize{\@setfontsize{\sublargesize}{12}{14pt}} +\def\large{\@setfontsize{\large}{12}{14pt}} +\def\Large{\@setfontsize{\Large}{14}{17pt}} +\def\LARGE{\@setfontsize{\LARGE}{17}{20pt}} +\def\huge{\@setfontsize{\huge}{20}{24pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi +% +% 12pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\typeout{-- This is a 12 point document.} +\def\normalsize{\@setfontsize{\normalsize}{12}{13.92pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.92pt} +\normalsize +\abovedisplayskip 1.5ex plus 6pt minus 4pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6pt +\belowdisplayshortskip 1.5ex plus 6pt minus 4pt +\def\small{\@setfontsize{\small}{10}{12pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}} +\def\tiny{\@setfontsize{\tiny}{6}{7pt}} +% sublargesize is the same as large - 14pt +\def\sublargesize{\@setfontsize{\sublargesize}{14}{17pt}} +\def\large{\@setfontsize{\large}{14}{17pt}} +\def\Large{\@setfontsize{\Large}{17}{20pt}} +\def\LARGE{\@setfontsize{\LARGE}{20}{24pt}} +\def\huge{\@setfontsize{\huge}{22}{26pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi + + + +% V1.8a compsoc font sizes +% compsoc font sizes use bp "Postscript" point units (1/72in) +% rather than the traditional pt (1/72.27) +\ifCLASSOPTIONcompsoc +% -- compsoc defaults -- +% ** will override some of these values later ** +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{11bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\def\small{\@setfontsize{\small}{8.5bp}{10bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}} +\def\tiny{\@setfontsize{\tiny}{5bp}{6bp}} +% sublargesize is the same as large - 10bp +\def\sublargesize{\@setfontsize{\sublargesize}{10bp}{12bp}} +\def\large{\@setfontsize{\large}{10bp}{12bp}} +\def\Large{\@setfontsize{\Large}{12bp}{14bp}} +\def\LARGE{\@setfontsize{\LARGE}{14bp}{17bp}} +\def\huge{\@setfontsize{\huge}{17bp}{20bp}} +\def\Huge{\@setfontsize{\Huge}{20bp}{24bp}} +\fi +% +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\def\normalsize{\@setfontsize{\normalsize}{10bp}{12bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{12bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\def\small{\@setfontsize{\small}{9bp}{10bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}} +\def\tiny{\@setfontsize{\tiny}{5bp}{6bp}} +% sublargesize is a tad smaller than large - 11bp +\def\sublargesize{\@setfontsize{\sublargesize}{11bp}{13.5bp}} +\def\large{\@setfontsize{\large}{12bp}{14bp}} +\def\Large{\@setfontsize{\Large}{14bp}{17bp}} +\def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}} +\def\huge{\@setfontsize{\huge}{20bp}{24bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.5bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.5bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\def\small{\@setfontsize{\small}{10bp}{12bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}} +\def\tiny{\@setfontsize{\tiny}{6bp}{7bp}} +% sublargesize is the same as large - 12bp +\def\sublargesize{\@setfontsize{\sublargesize}{12bp}{14bp}} +\def\large{\@setfontsize{\large}{12bp}{14bp}} +\def\Large{\@setfontsize{\Large}{14bp}{17bp}} +\def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}} +\def\huge{\@setfontsize{\huge}{20bp}{24bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14bp}}% +\setlength{\@IEEEnormalsizeunitybaselineskip}{14bp}% +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\def\small{\@setfontsize{\small}{10bp}{12bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}} +\def\tiny{\@setfontsize{\tiny}{6bp}{7bp}} +% sublargesize is the same as large - 14bp +\def\sublargesize{\@setfontsize{\sublargesize}{14bp}{17bp}} +\def\large{\@setfontsize{\large}{14bp}{17bp}} +\def\Large{\@setfontsize{\Large}{17bp}{20bp}} +\def\LARGE{\@setfontsize{\LARGE}{20bp}{24bp}} +\def\huge{\@setfontsize{\huge}{22bp}{26bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% -- override defaults: compsoc journals use special normalsizes -- +\ifCLASSOPTIONconference +% +% compsoc conferences +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\fi +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\def\normalsize{\@setfontsize{\normalsize}{10bp}{11.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\fi +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\fi +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp} +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\fi +% +% compsoc nonconferences +\else +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\fi +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +% the official spec is 9.5bp with 11.4bp leading for 10pt, +% but measurements of proofs suggest upto 11.723bp leading +% here we'll use 11.54bp which gives 61 lines per column +% with the standard compsoc margins +\def\normalsize{\@setfontsize{\normalsize}{9.5bp}{11.54bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.54bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\fi +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\fi +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp} +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\fi +\fi\fi + + + + +% V1.6 The Computer Modern Fonts will issue a substitution warning for +% 24pt titles (24.88pt is used instead, but the default and correct +% Times font will scale exactly as needed) increase the substitution +% tolerance to turn off this warning. +% +% V1.8a, the compsoc bp font sizes can also cause bogus font substitution +% warnings with footnote or scriptsize math and the $\bullet$ itemized +% list of \IEEEcompsocitemizethanks. So, increase this to 1.5pt or more. +\def\fontsubfuzz{1.7bp} + + +% warn the user in case they forget to use the 9pt option with +% technote +\ifCLASSOPTIONtechnote% + \ifx\CLASSOPTIONpt\@IEEEptsizenine\else% + \typeout{** ATTENTION: Technotes are normally 9pt documents.}% + \fi% +\fi + + +% V1.7 +% Improved \textunderscore to provide a much better fake _ when used with +% OT1 encoding. Under OT1, detect use of pcr or cmtt \ttfamily and use +% available true _ glyph for those two typewriter fonts. +\def\@IEEEstringptm{ptm} % Times Roman family +\def\@IEEEstringppl{ppl} % Palatino Roman family +\def\@IEEEstringphv{phv} % Helvetica Sans Serif family +\def\@IEEEstringpcr{pcr} % Courier typewriter family +\def\@IEEEstringcmtt{cmtt} % Computer Modern typewriter family +\DeclareTextCommandDefault{\textunderscore}{\leavevmode +\ifx\f@family\@IEEEstringpcr\string_\else +\ifx\f@family\@IEEEstringcmtt\string_\else +\ifx\f@family\@IEEEstringptm\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else +\ifx\f@family\@IEEEstringppl\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else +\ifx\f@family\@IEEEstringphv\kern -0.03em\vbox{\hrule\@width 0.62em\@height 0.52pt\kern -0.33ex}\kern -0.03em\else +\kern 0.09em\vbox{\hrule\@width 0.6em\@height 0.44pt\kern -0.63pt\kern -0.42ex}\kern 0.09em\fi\fi\fi\fi\fi\relax} + + + + +% set the default \baselinestretch +\def\baselinestretch{1} +\ifCLASSOPTIONdraftcls + \def\baselinestretch{1.5}% default baselinestretch for draft modes +\fi + + +% process CLASSINPUT baselinestretch +\ifx\CLASSINPUTbaselinestretch\@IEEEundefined +\else + \edef\baselinestretch{\CLASSINPUTbaselinestretch} % user CLASSINPUT override + \typeout{** ATTENTION: Overriding \string\baselinestretch\space to + \baselinestretch\space via \string\CLASSINPUT.} +\fi + +\small\normalsize % make \baselinestretch take affect + + + + +% store the normalsize baselineskip +\newdimen\CLASSINFOnormalsizebaselineskip +\CLASSINFOnormalsizebaselineskip=\baselineskip\relax +% and the normalsize unity (baselinestretch=1) baselineskip +% we could save a register by giving the user access to +% \@IEEEnormalsizeunitybaselineskip. However, let's protect +% its read only internal status +\newdimen\CLASSINFOnormalsizeunitybaselineskip +\CLASSINFOnormalsizeunitybaselineskip=\@IEEEnormalsizeunitybaselineskip\relax +% store the nominal value of jot +\newdimen\IEEEnormaljot +\IEEEnormaljot=0.25\baselineskip\relax + +% set \jot +\jot=\IEEEnormaljot\relax + + + + +% V1.6, we are now going to fine tune the interword spacing +% The default interword glue for Times under TeX appears to use a +% nominal interword spacing of 25% (relative to the font size, i.e., 1em) +% a maximum of 40% and a minimum of 19%. +% For example, 10pt text uses an interword glue of: +% +% 2.5pt plus 1.49998pt minus 0.59998pt +% +% However, the IEEE allows for a more generous range which reduces the need +% for hyphenation, especially for two column text. Furthermore, the IEEE +% tends to use a little bit more nominal space between the words. +% The IEEE's interword spacing percentages appear to be: +% 35% nominal +% 23% minimum +% 50% maximum +% (They may even be using a tad more for the largest fonts such as 24pt.) +% +% for bold text, the IEEE increases the spacing a little more: +% 37.5% nominal +% 23% minimum +% 55% maximum + +% here are the interword spacing ratios we'll use +% for medium (normal weight) +\def\@IEEEinterspaceratioM{0.35} +\def\@IEEEinterspaceMINratioM{0.23} +\def\@IEEEinterspaceMAXratioM{0.50} + +% for bold +\def\@IEEEinterspaceratioB{0.375} +\def\@IEEEinterspaceMINratioB{0.23} +\def\@IEEEinterspaceMAXratioB{0.55} + + +% compsoc nonconference papers use Palatino, +% tweak settings to better match the proofs +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference\else +% for medium (normal weight) +\def\@IEEEinterspaceratioM{0.28} +\def\@IEEEinterspaceMINratioM{0.21} +\def\@IEEEinterspaceMAXratioM{0.47} +% for bold +\def\@IEEEinterspaceratioB{0.305} +\def\@IEEEinterspaceMINratioB{0.21} +\def\@IEEEinterspaceMAXratioB{0.52} +\fi\fi + + +% command to revise the interword spacing for the current font under TeX: +% \fontdimen2 = nominal interword space +% \fontdimen3 = interword stretch +% \fontdimen4 = interword shrink +% since all changes to the \fontdimen are global, we can enclose these commands +% in braces to confine any font attribute or length changes +\def\@@@IEEEsetfontdimens#1#2#3{{% +\setlength{\@IEEEtrantmpdimenB}{\f@size pt}% grab the font size in pt, could use 1em instead. +\setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}% +\fontdimen2\font=\@IEEEtrantmpdimenA\relax +\addtolength{\@IEEEtrantmpdimenA}{-#2\@IEEEtrantmpdimenB}% +\fontdimen3\font=-\@IEEEtrantmpdimenA\relax +\setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}% +\addtolength{\@IEEEtrantmpdimenA}{-#3\@IEEEtrantmpdimenB}% +\fontdimen4\font=\@IEEEtrantmpdimenA\relax}} + +% revise the interword spacing for each font weight +\def\@@IEEEsetfontdimens{{% +\mdseries +\@@@IEEEsetfontdimens{\@IEEEinterspaceratioM}{\@IEEEinterspaceMAXratioM}{\@IEEEinterspaceMINratioM}% +\bfseries +\@@@IEEEsetfontdimens{\@IEEEinterspaceratioB}{\@IEEEinterspaceMAXratioB}{\@IEEEinterspaceMINratioB}% +}} + +% revise the interword spacing for each font shape +% \slshape is not often used for IEEE work and is not altered here. The \scshape caps are +% already a tad too large in the free LaTeX fonts (as compared to what the IEEE uses) so we +% won't alter these either. +\def\@IEEEsetfontdimens{{% +\normalfont +\@@IEEEsetfontdimens +\normalfont\itshape +\@@IEEEsetfontdimens +}} + +% command to revise the interword spacing for each font size (and shape +% and weight). Only the \rmfamily is done here as \ttfamily uses a +% fixed spacing and \sffamily is not used as the main text of IEEE papers. +\def\@IEEEtunefonts{{\selectfont\rmfamily +\tiny\@IEEEsetfontdimens +\scriptsize\@IEEEsetfontdimens +\footnotesize\@IEEEsetfontdimens +\small\@IEEEsetfontdimens +\normalsize\@IEEEsetfontdimens +\sublargesize\@IEEEsetfontdimens +\large\@IEEEsetfontdimens +\LARGE\@IEEEsetfontdimens +\huge\@IEEEsetfontdimens +\Huge\@IEEEsetfontdimens}} + +% if the nofonttune class option is not given, revise the interword spacing +% now - in case IEEEtran makes any default length measurements, and make +% sure all the default fonts are loaded +\ifCLASSOPTIONnofonttune\else +\@IEEEtunefonts +\fi + +% and again at the start of the document in case the user loaded different fonts +\AtBeginDocument{\ifCLASSOPTIONnofonttune\else\@IEEEtunefonts\fi} + + + + + +% -- V1.8a page setup commands -- + +% The default sample text for calculating margins +% Note that IEEE publications use \scriptsize for headers and footers. +\def\IEEEdefaultsampletext{\normalfont\normalsize gT} +\def\IEEEdefaultheadersampletext{\normalfont\scriptsize T}% IEEE headers default to uppercase +\def\IEEEdefaultfootersampletext{\normalfont\scriptsize gT} + + + +% usage: \IEEEsettextwidth{inner margin}{outer margin} +% Sets \textwidth to allow the specified inner and outer margins +% for the current \paperwidth. +\def\IEEEsettextwidth#1#2{\@IEEEtrantmpdimenA\paperwidth +\@IEEEtrantmpdimenB#1\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\@IEEEtrantmpdimenB#2\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\textwidth\@IEEEtrantmpdimenA} + + + +% usage: \IEEEsetsidemargin{mode: i, o, c, a}{margin/offset} +% Sets \oddsidemargin and \evensidemargin to yield the specified margin +% of the given mode. +% The available modes are: +% i = inner margin +% o = outer margin +% c = centered, with the given offset +% a = adjust the margins using the given offset +% For the offsets, positive values increase the inner margin. +% \textwidth should be set properly for the given margins before calling this +% function. +\def\IEEEsetsidemargin#1#2{\@IEEEtrantmpdimenA #2\relax +\@IEEEextracttoken{#1}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `i'}{Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}\relax + \let\@IEEEextractedtoken=i\relax + \def\@IEEEextractedtokenmacro{i}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetsidemargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken c\relax + \oddsidemargin\paperwidth + \advance\oddsidemargin by -\textwidth + \divide\oddsidemargin by 2\relax + \advance\oddsidemargin by -1in\relax + \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken o\relax + \oddsidemargin\paperwidth + \advance\oddsidemargin by -\textwidth + \advance\oddsidemargin by -\@IEEEtrantmpdimenA + \advance\oddsidemargin by -1in\relax +\else + \if\@IEEEextractedtoken i\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `i'}% + {Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}% + \fi + \oddsidemargin\@IEEEtrantmpdimenA + \advance\oddsidemargin by -1in\relax +\fi\fi\fi +% odd and even side margins both mean "inner" for single sided pages +\evensidemargin\oddsidemargin +% but are mirrors of each other when twosided is in effect +\if@twoside + \evensidemargin\paperwidth + \advance\evensidemargin by -\textwidth + \advance\evensidemargin by -\oddsidemargin + % have to compensate for both the builtin 1in LaTex offset + % and the fact we already subtracted this offset from \oddsidemargin + \advance\evensidemargin -2in\relax +\fi} + + + +% usage: \IEEEsettextheight[sample text]{top text margin}{bottom text margin} +% Sets \textheight based on the specified top margin and bottom margin. +% Takes into consideration \paperheight, \topskip, and (by default) the +% the actual height and depth of the \IEEEdefaultsampletext text. +\def\IEEEsettextheight{\@ifnextchar [{\@IEEEsettextheight}{\@IEEEsettextheight[\IEEEdefaultsampletext]}} +\def\@IEEEsettextheight[#1]#2#3{\textheight\paperheight\relax + \@IEEEtrantmpdimenA #2\relax + \advance \textheight by -\@IEEEtrantmpdimenA% subtract top margin + \@IEEEtrantmpdimenA #3\relax + \advance \textheight by -\@IEEEtrantmpdimenA% subtract bottom margin + \advance \textheight by \topskip% add \topskip + % subtract off everything above the top, and below the bottom, baselines + \settoheight{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance \textheight by -\@IEEEtrantmpdimenA + \settodepth{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance \textheight by -\@IEEEtrantmpdimenA} + + + +\newdimen\IEEEquantizedlength +\IEEEquantizedlength 0sp\relax +\newdimen\IEEEquantizedlengthdiff +\IEEEquantizedlengthdiff 0sp\relax +\def\IEEEquantizedlengthint{0} + +% usage: \IEEEquantizelength{mode: d, c, i}{base unit}{length} +% Sets the length \IEEEquantizedlength to be an integer multiple of the given +% (nonzero) base unit such that \IEEEquantizedlength approximates the given +% length. +% \IEEEquantizedlengthdiff is a length equal to the difference between the +% \IEEEquantizedlength and the given length. +% \IEEEquantizedlengthint is a macro containing the integer number of base units +% in \IEEEquantizedlength. +% i.e., \IEEEquantizedlength = \IEEEquantizedlengthint * base unit +% The mode determines how \IEEEquantizedlength is quantized: +% d = always decrease (always round down \IEEEquantizeint) +% c = use the closest match +% i = always increase (always round up \IEEEquantizeint) +% In anycase, if the given length is already quantized, +% \IEEEquantizedlengthdiff will be set to zero. +\def\IEEEquantizelength#1#2#3{\begingroup +% work in isolation so as not to externally disturb the \@IEEEtrantmp +% variables +% load the argument values indirectly via \IEEEquantizedlengthdiff +% in case the user refers to our \@IEEEtrantmpdimenX, \IEEEquantizedlength, +% etc. in the arguments. we also will work with these as counters, +% i.e., in sp units +% A has the base unit +\IEEEquantizedlengthdiff #2\relax\relax\relax\relax +\@IEEEtrantmpcountA\IEEEquantizedlengthdiff +% B has the input length +\IEEEquantizedlengthdiff #3\relax\relax\relax\relax +\@IEEEtrantmpcountB\IEEEquantizedlengthdiff +\@IEEEtrantmpdimenA\the\@IEEEtrantmpcountA sp\relax +\@IEEEtrantmpdimenB\the\@IEEEtrantmpcountB sp\relax +% \@IEEEtrantmpcountC will have the quantized int +% \IEEEquantizedlength will have the quantized length +% \@IEEEtrantmpdimenC will have the quantized diff +% initialize them to zero as this is what will be +% exported if an error occurs +\@IEEEtrantmpcountC 0\relax +\IEEEquantizedlength 0sp\relax +\@IEEEtrantmpdimenC 0sp\relax +% extract mode +\@IEEEextracttoken{#1}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + Defaulting to `d'}{Valid modes for \string\IEEEquantizelength\space are: d, c and i.}\relax + \let\@IEEEextractedtoken=d\relax + \def\@IEEEextractedtokenmacro{d}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEquantizelength\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% check for base unit is zero error +\ifnum\@IEEEtrantmpcountA=0\relax +\@IEEEclspkgerror{Base unit is zero in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + \string\IEEEquantizedlength\space and \string\IEEEquantizedlengthdiff\space are set to zero}{Division by zero is not allowed.}\relax +\else% base unit is nonzero + % \@IEEEtrantmpcountC carries the number of integer units + % in the quantized length (integer length \ base) + \@IEEEtrantmpcountC\@IEEEtrantmpcountB\relax + \divide\@IEEEtrantmpcountC by \@IEEEtrantmpcountA\relax + % \IEEEquantizedlength has the (rounded down) quantized length + % = base * int + \IEEEquantizedlength\@IEEEtrantmpdimenA\relax + \multiply\IEEEquantizedlength by \@IEEEtrantmpcountC\relax + % \@IEEEtrantmpdimenC has the difference + % = quantized length - length + \@IEEEtrantmpdimenC\IEEEquantizedlength\relax + \advance\@IEEEtrantmpdimenC by -\@IEEEtrantmpdimenB\relax + % trap special case of length being already quantized + % to avoid a roundup under i option + \ifdim\@IEEEtrantmpdimenC=0sp\relax + \else % length not is already quantized + % set dimenA to carry the upper quantized (absolute value) difference: + % quantizedlength + base - length + \advance\@IEEEtrantmpdimenA by \IEEEquantizedlength\relax + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB\relax + % set dimenB to carry the lower quantized (absolute value) difference: + % length - quantizedlength + \advance\@IEEEtrantmpdimenB by -\IEEEquantizedlength\relax + % handle each mode + \if\@IEEEextractedtoken c\relax + % compare upper and lower amounts, select upper if lower > upper + \ifdim\@IEEEtrantmpdimenB>\@IEEEtrantmpdimenA\relax + % use upper + \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax + \advance\@IEEEtrantmpcountC by 1\relax + \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA + \else% <=. uselower + % no need to do anything for lower, use output values already setup + \fi + \else% not mode c + \if\@IEEEextractedtoken i\relax + % always round up under i mode + \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax + \advance\@IEEEtrantmpcountC by 1\relax + \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA + \else + \if\@IEEEextractedtoken d\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + Defaulting to `d'}% + {Valid modes for \string\IEEEquantizelength\space are: d, c, and i.}\relax + \fi % if d + % no need to do anything for d, use output values already setup + \fi\fi % if i, c + \fi % if length is already quantized +\fi% if base unit is zero +% globally assign the results to macros we use here to escape the enclosing +% group without needing to call \global on any of the \@IEEEtrantmp variables. +% \@IEEEtrantmpcountC has the quantized int +% \IEEEquantizedlength has the quantized length +% \@IEEEtrantmpdimenC has the quantized diff +\xdef\@IEEEquantizedlengthintmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlength\relax +\xdef\@IEEEquantizedlengthmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\@IEEEtrantmpdimenC\relax +\xdef\@IEEEquantizedlengthdiffmacro{\the\@IEEEtrantmpcountC}\relax +\endgroup +% locally assign the outputs here from the macros +\expandafter\IEEEquantizedlength\@IEEEquantizedlengthmacro sp\relax +\expandafter\IEEEquantizedlengthdiff\@IEEEquantizedlengthdiffmacro sp\relax +\edef\IEEEquantizedlengthint{\@IEEEquantizedlengthintmacro}\relax} + + + +\newdimen\IEEEquantizedtextheightdiff +\IEEEquantizedtextheightdiff 0sp\relax + +% usage: \IEEEquantizetextheight[base unit]{mode: d, c, i} +% Sets \textheight to be an integer multiple of the current \baselineskip +% (or the optionally specified base unit) plus the first (\topskip) line. +% \IEEEquantizedtextheightdiff is a length equal to the difference between +% the new quantized and original \textheight. +% \IEEEquantizedtextheightlpc is a macro containing the integer number of +% lines per column under the quantized \textheight. i.e., +% \textheight = \IEEEquantizedtextheightlpc * \baselineskip + \topskip +% The mode determines how \textheight is quantized: +% d = always decrease (always round down the number of lines per column) +% c = use the closest match +% i = always increase (always round up the number of lines per column) +% In anycase, if \textheight is already quantized, it will remain unchanged, +% and \IEEEquantizedtextheightdiff will be set to zero. +% Depends on: \IEEEquantizelength +\def\IEEEquantizetextheight{\@ifnextchar [{\@IEEEquantizetextheight}{\@IEEEquantizetextheight[\baselineskip]}} +\def\@IEEEquantizetextheight[#1]#2{\begingroup +% use our \IEEEquantizedtextheightdiff as a scratch pad +% we need to subtract off \topskip before quantization +\IEEEquantizedtextheightdiff\textheight +\advance\IEEEquantizedtextheightdiff by -\topskip\relax +\IEEEquantizelength{#2}{#1}{\IEEEquantizedtextheightdiff} +% add back \topskip line +\advance\IEEEquantizedlength by \topskip +\@IEEEtrantmpcountC\IEEEquantizedlengthint\relax +\advance\@IEEEtrantmpcountC by 1\relax +% globally assign the results to macros we use here to escape the enclosing +% group without needing to call \global on any of the \@IEEEtrantmp variables. +\xdef\@IEEEquantizedtextheightlpcmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlength\relax +\xdef\@IEEEquantizedtextheightmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlengthdiff\relax +\xdef\@IEEEquantizedtextheightdiffmacro{\the\@IEEEtrantmpcountC}\relax +\endgroup +% locally assign the outputs here from the macros +\textheight\@IEEEquantizedtextheightmacro sp\relax +\IEEEquantizedtextheightdiff\@IEEEquantizedtextheightdiffmacro sp\relax +\edef\IEEEquantizedtextheightlpc{\@IEEEquantizedtextheightlpcmacro}} + + + +% usage: \IEEEsettopmargin[sample text]{mode: t, b, c, a, q}{margin/offset} +% Sets \topmargin based on the specified vertical margin. +% Takes into consideration the base 1in offset, \headheight, \headsep, +% \topskip, and (by default) the the actual height (or, for the bottom, depth) +% of the \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin +% b = bottom margin +% c = vertically centered, with the given offset +% a = adjust the vertical margins using the given offset +% q = adjust the margins using \IEEEquantizedtextheightdiff and the given offset +% For the offsets, positive values increase the top margin. +% \headheight, \headsep, \topskip and \textheight should be set properly for the +% given margins before calling this function. +\def\IEEEsettopmargin{\@ifnextchar [{\@IEEEsettopmargin}{\@IEEEsettopmargin[\IEEEdefaultsampletext]}} +\def\@IEEEsettopmargin[#1]#2#3{\@IEEEtrantmpdimenA #3\relax +\@IEEEextracttoken{#2}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsettopmargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken q\relax + % we need to adjust by half the \IEEEquantizedtextheightdiff value + \@IEEEtrantmpdimenB\IEEEquantizedtextheightdiff\relax + \divide\@IEEEtrantmpdimenB by 2\relax + % a positive \IEEEquantizedtextheightdiff means we need to reduce \topmargin + % because \textheight has been lenghtened + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken c\relax + \topmargin\paperheight + \advance\topmargin by -\textheight + % \textheight includes \topskip, but we should not count topskip whitespace here, backout + \advance \topmargin by \topskip + \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \divide\topmargin by 2\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken b\relax + \topmargin\paperheight + \advance\topmargin by -\textheight + % \textheight includes \topskip, but we should not count topskip whitespace here, backout + \advance \topmargin by \topskip + \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \advance\topmargin by -\@IEEEtrantmpdimenA\relax +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax + \fi + \topmargin\@IEEEtrantmpdimenA\relax + \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by \@IEEEtrantmpdimenB\relax +\fi\fi % if t, b, c +% convert desired top margin into actual \topmargin +% this is not done for the q or a modes because they are only adjustments +\advance \topmargin by -\topskip +\advance \topmargin by -1in +\advance \topmargin by -\headheight +\advance \topmargin by -\headsep +\fi\fi % if q, a +} + + + +% usage: \IEEEsetheadermargin[header sample][text sample]{mode: t, b, c, a}{margin/offset} +% Differentially adjusts \topmargin and \headsep (such that their sum is unchanged) +% based on the specified header margin. +% Takes into consideration the base 1in offset, \headheight, \topskip, and (by default) +% the actual height (or depth) of the \IEEEdefaultheadersampletext and +% \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin (top of the header text to the top of the page) +% b = bottom margin (bottom of the header text to the top of the main text) +% c = vertically centered between the main text and the top of the page, +% with the given offset +% a = adjust the vertical position using the given offset +% For the offsets, positive values move the header downward. +% \headheight, \headsep, \topskip and \topmargin should be set properly before +% calling this function. +\def\IEEEsetheadermargin{\@ifnextchar [{\@IEEEsetheadermargin}{\@IEEEsetheadermargin[\IEEEdefaultheadersampletext]}} +\def\@IEEEsetheadermargin[#1]{\@ifnextchar [{\@@IEEEsetheadermargin[#1]}{\@@IEEEsetheadermargin[#1][\IEEEdefaultsampletext]}} +\def\@@IEEEsetheadermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax +\@IEEEextracttoken{#3}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsetheadermargin\space are: t, b, c, and a.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetheadermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + % No need to do anything here and can pass through the adjustment + % value as is. The end adjustment of \topmargin and \headsep will + % do all that is needed +\else +\if\@IEEEextractedtoken c\relax + % get the bottom margin + \@IEEEtrantmpdimenB\headsep\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \advance\@IEEEtrantmpdimenB by \topskip + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header bottom margin + % subtract from it the top header margin + \advance\@IEEEtrantmpdimenB -1in\relax % take into consideration the system 1in offset of the top margin + \advance\@IEEEtrantmpdimenB by -\topmargin + \advance\@IEEEtrantmpdimenB by -\headheight + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the difference between the bottom and top margins + % we need to adjust by half this amount to center the header + \divide\@IEEEtrantmpdimenB by 2\relax + % and add to offset + \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB +\else +\if\@IEEEextractedtoken b\relax + \@IEEEtrantmpdimenB\headsep\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \advance\@IEEEtrantmpdimenB by \topskip + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header bottom margin + % get the difference between the actual and the desired + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA + \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsetheadermargin\space are: t, b, c and a.}\relax + \fi + \@IEEEtrantmpdimenB 1in\relax % take into consideration the system 1in offset of the top margin + \advance\@IEEEtrantmpdimenB by \topmargin + \advance\@IEEEtrantmpdimenB by \headheight + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header top margin + % get the difference between the desired and the actual + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\fi\fi % if t, b, c +\fi % if a +% advance \topmargin by the needed amount and reduce \headsep by the same +% so as not to disturb the location of the main text +\advance\topmargin by \@IEEEtrantmpdimenA\relax +\advance\headsep by -\@IEEEtrantmpdimenA\relax +} + + + +% usage: \IEEEsetfootermargin[footer sample][text sample]{mode: t, b, c, a}{margin/offset} +% Adjusts \footskip based on the specified footer margin. +% Takes into consideration the base 1in offset, \paperheight, \headheight, +% \headsep, \textheight and (by default) the actual height (or depth) of the +% \IEEEdefaultfootersampletext and \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin (top of the footer text to the bottom of the main text) +% b = bottom margin (bottom of the footer text to the bottom of page) +% c = vertically centered between the main text and the bottom of the page, +% with the given offset +% a = adjust the vertical position using the given offset +% For the offsets, positive values move the footer downward. +% \headheight, \headsep, \topskip, \topmargin, and \textheight should be set +% properly before calling this function. +\def\IEEEsetfootermargin{\@ifnextchar [{\@IEEEsetfootermargin}{\@IEEEsetfootermargin[\IEEEdefaultfootersampletext]}} +\def\@IEEEsetfootermargin[#1]{\@ifnextchar [{\@@IEEEsetfootermargin[#1]}{\@@IEEEsetfootermargin[#1][\IEEEdefaultsampletext]}} +\def\@@IEEEsetfootermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax +\@IEEEextracttoken{#3}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsetfootermargin\space are: t, b, c, and a.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetfootermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + % No need to do anything here and can pass through the adjustment + % value as is. The end adjustment of \footskip will do all that + % is needed +\else +\if\@IEEEextractedtoken c\relax + % calculate the bottom margin + \@IEEEtrantmpdimenB 1in\relax % system 1in offset + \advance\@IEEEtrantmpdimenB\topmargin\relax + \advance\@IEEEtrantmpdimenB\headheight\relax + \advance\@IEEEtrantmpdimenB\headsep\relax + \advance\@IEEEtrantmpdimenB\textheight\relax + \advance\@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB + \@IEEEtrantmpdimenB\paperheight + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin + % now subtract off the footer top margin + \advance\@IEEEtrantmpdimenB -\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the difference between the bottom + % and top footer margins + % our adjustment must be half this value to center the footer + \divide\@IEEEtrantmpdimenB by 2\relax + % add to the offset + \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB +\else +\if\@IEEEextractedtoken b\relax + % calculate the bottom margin + \@IEEEtrantmpdimenB 1in\relax % system 1in offset + \advance\@IEEEtrantmpdimenB\topmargin\relax + \advance\@IEEEtrantmpdimenB\headheight\relax + \advance\@IEEEtrantmpdimenB\headsep\relax + \advance\@IEEEtrantmpdimenB\textheight\relax + \advance\@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB + \@IEEEtrantmpdimenB\paperheight + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin + % get the difference between the actual and the desired + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA + \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsetfootermargin\space are: t, b, c and a.}\relax + \fi + \@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer top margin + % get the difference between the desired and the actual + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\fi\fi % if t, b, c +\fi % if a +% advance \footskip by the needed amount +\advance\footskip by \@IEEEtrantmpdimenA\relax +} + +% -- End V1.8a page setup commands -- + + + + + +% V1.6 +% LaTeX is a little to quick to use hyphenations +% So, we increase the penalty for their use and raise +% the badness level that triggers an underfull hbox +% warning. The author may still have to tweak things, +% but the appearance will be much better "right out +% of the box" than that under V1.5 and prior. +% TeX default is 50 +\hyphenpenalty=750 +\ifCLASSOPTIONcompsoc +\hyphenpenalty 500 +\fi +% If we didn't adjust the interword spacing, 2200 might be better. +% The TeX default is 1000 +\hbadness=1350 +% The IEEE does not use extra spacing after punctuation +\frenchspacing + +% V1.7 increase this a tad to discourage equation breaks +\binoppenalty=1000 % default 700 +\relpenalty=800 % default 500 + +% v1.8a increase these to discourage widows and orphans +\clubpenalty=1000 % default 150 +\widowpenalty=1000 % default 150 +\displaywidowpenalty=1000 % default 50 + + +% margin note stuff +\marginparsep 10pt +\marginparwidth 20pt +\marginparpush 25pt + + +% if things get too close, go ahead and let them touch +\lineskip 0pt +\normallineskip 0pt +\lineskiplimit 0pt +\normallineskiplimit 0pt + +% The distance from the lower edge of the text body to the +% footline +\footskip 0.4in + +% normally zero, should be relative to font height. +% put in a little rubber to help stop some bad breaks (underfull vboxes) +\parskip 0ex plus 0.2ex minus 0.1ex + +\parindent 1.0em +\ifCLASSOPTIONcompsoc + \parindent 1.5em +\fi + +\headheight 12pt +\headsep 18pt +% use the normal font baselineskip +% so that \topskip is unaffected by changes in \baselinestretch +\topskip=\@IEEEnormalsizeunitybaselineskip + + +% V1.8 \maxdepth defaults to 4pt, but should be font size dependent +\maxdepth=0.5\@IEEEnormalsizeunitybaselineskip +\textheight 58pc % 9.63in, 696pt + +% set the default top margin to 58pt +% which results in a \topmargin of -49.59pt for 10pt documents +\IEEEsettopmargin{t}{58pt} +% tweak textheight to a perfect integer number of lines/column. +% standard is: 9pt/63 lpc; 10pt/58 lpc; 11pt/52 lpc; 12pt/50 lpc +\IEEEquantizetextheight{c} +% tweak top margin so that the error is shared equally at the top and bottom +\IEEEsettopmargin{q}{0sp} + + +\columnsep 1pc +\textwidth 43pc % 2 x 21pc + 1pc = 43pc + +% set the default side margins to center the text +\IEEEsetsidemargin{c}{0pt} + + +% adjust margins for default conference mode +\ifCLASSOPTIONconference + \textheight 9.25in % The standard for conferences (668.4975pt) + \IEEEsettopmargin{t}{0.75in} + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/61 lpc; 10pt/56 lpc; 11pt/50 lpc; 12pt/48 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} +\fi + + +% compsoc text sizes, margins and spacings +\ifCLASSOPTIONcompsoc + \columnsep 12bp + % CS specs for \textwdith are 6.875in + % \textwidth 6.875in + % however, measurements from proofs show they are using 3.5in columns + \textwidth 7in + \advance\textwidth by \columnsep + % set the side margins to center the text + \IEEEsetsidemargin{c}{0pt} + % top/bottom margins to center + % could just set \textheight to 9.75in for all the different paper sizes + % and then quantize, but we'll do it the long way here to allow for easy + % future per-paper size adjustments + \IEEEsettextheight{0.625in}{0.625in}% 11in - 2 * 0.625in = 9.75in is the standard text height for compsoc journals + \IEEEsettopmargin{t}{0.625in} + \if@IEEEusingcspaper + \IEEEsettextheight{0.5in}{0.5in}% 10.75in - 2 * 0.5in = 9.75in + \IEEEsettopmargin{t}{0.5in} + \fi + \if@IEEEusingAfourpaper + \IEEEsettextheight{24.675mm}{24.675mm}% 297mm - 2 * 24.675mm = 247.650mm (9.75in) + \IEEEsettopmargin{t}{24.675mm} + \fi + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/65 lpc; 10pt/61 lpc; 11pt/53 lpc; 12pt/49 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} + +% compsoc conference + \ifCLASSOPTIONconference + % compsoc conference use a larger value for columnsep + \columnsep 0.25in + \IEEEsettextwidth{0.75in}{0.75in} + % set the side margins to center the text (0.75in for letterpaper) + \IEEEsetsidemargin{c}{0pt} + % compsoc conferences want 1in top and bottom margin + \IEEEsettextheight{1in}{1in} + \IEEEsettopmargin{t}{1in} + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/58 lpc; 10pt/53 lpc; 11pt/48 lpc; 12pt/46 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} + \fi +\fi + + + +% draft mode settings override that of all other modes +% provides a nice 1in margin all around the paper and extra +% space between the lines for editor's comments +\ifCLASSOPTIONdraftcls + % we want 1in side margins regardless of paper type + \IEEEsettextwidth{1in}{1in} + \IEEEsetsidemargin{c}{0pt} + % want 1in top and bottom margins + \IEEEsettextheight{1in}{1in} + \IEEEsettopmargin{t}{1in} + % digitize textheight to be an integer number of lines. + % this may cause the top and bottom margins to be off a tad + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} +\fi + + + +% process CLASSINPUT inner/outer margin +% if inner margin defined, but outer margin not, set outer to inner. +\ifx\CLASSINPUTinnersidemargin\@IEEEundefined +\else + \ifx\CLASSINPUToutersidemargin\@IEEEundefined + \edef\CLASSINPUToutersidemargin{\CLASSINPUTinnersidemargin} + \fi +\fi + +\ifx\CLASSINPUToutersidemargin\@IEEEundefined +\else + % if outer margin defined, but inner margin not, set inner to outer. + \ifx\CLASSINPUTinnersidemargin\@IEEEundefined + \edef\CLASSINPUTinnersidemargin{\CLASSINPUToutersidemargin} + \fi + \IEEEsettextwidth{\CLASSINPUTinnersidemargin}{\CLASSINPUToutersidemargin} + \IEEEsetsidemargin{i}{\CLASSINPUTinnersidemargin} + \typeout{** ATTENTION: Overriding inner side margin to \CLASSINPUTinnersidemargin\space and + outer side margin to \CLASSINPUToutersidemargin\space via \string\CLASSINPUT.} +\fi + + + +% process CLASSINPUT top/bottom text margin +% if toptext margin defined, but bottomtext margin not, set bottomtext to toptext margin +\ifx\CLASSINPUTtoptextmargin\@IEEEundefined +\else + \ifx\CLASSINPUTbottomtextmargin\@IEEEundefined + \edef\CLASSINPUTbottomtextmargin{\CLASSINPUTtoptextmargin} + \fi +\fi + +\ifx\CLASSINPUTbottomtextmargin\@IEEEundefined +\else + % if bottomtext margin defined, but toptext margin not, set toptext to bottomtext margin + \ifx\CLASSINPUTtoptextmargin\@IEEEundefined + \edef\CLASSINPUTtoptextmargin{\CLASSINPUTbottomtextmargin} + \fi + \IEEEsettextheight{\CLASSINPUTtoptextmargin}{\CLASSINPUTbottomtextmargin} + \IEEEsettopmargin{t}{\CLASSINPUTtoptextmargin} + \typeout{** ATTENTION: Overriding top text margin to \CLASSINPUTtoptextmargin\space and + bottom text margin to \CLASSINPUTbottomtextmargin\space via \string\CLASSINPUT.} +\fi + + + +% default to center header and footer text in the margins +\IEEEsetheadermargin{c}{0pt} +\IEEEsetfootermargin{c}{0pt} + +% adjust header and footer positions for compsoc journals +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONjournal + \IEEEsetheadermargin{b}{\@IEEEnormalsizeunitybaselineskip} + \IEEEsetfootermargin{t}{\@IEEEnormalsizeunitybaselineskip} + \fi +\fi + + +% V1.8a display lines per column info message on user's console +\def\IEEEdisplayinfolinespercolumn{\@IEEEtrantmpdimenA=\textheight +% topskip represents only one line even if > baselineskip +\advance\@IEEEtrantmpdimenA by -1\topskip +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenA +\@IEEEtrantmpcountB=\@IEEEtrantmpdimenA +\divide\@IEEEtrantmpcountB by \baselineskip +% need to add one line to include topskip (first) line +\advance\@IEEEtrantmpcountB by 1 +% save lines per column value as text +\edef\@IEEEnumlinespercolumninfotxt{\the\@IEEEtrantmpcountB} +% backout topskip advance to allow direct \@IEEEtrantmpcountA comparison +\advance\@IEEEtrantmpcountB by -1 +% restore value as text height (without topskip) rather than just as number of lines +\multiply\@IEEEtrantmpcountB by \baselineskip +% is the column height an integer number of lines per column? +\ifnum\@IEEEtrantmpcountA=\@IEEEtrantmpcountB +\edef\@IEEEnumlinespercolumnexactinfotxt{exact} +\else +\@IEEEtrantmpdimenA\@IEEEtrantmpcountA sp\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpcountB sp\relax +\edef\@IEEEnumlinespercolumnexactinfotxt{approximate, difference = \the\@IEEEtrantmpdimenA} +\fi +\typeout{-- Lines per column: \@IEEEnumlinespercolumninfotxt\space (\@IEEEnumlinespercolumnexactinfotxt).}} +% delay execution till start of document to allow for user changes +\AtBeginDocument{\IEEEdisplayinfolinespercolumn} + + + +% LIST SPACING CONTROLS + +% Controls the amount of EXTRA spacing +% above and below \trivlist +% Both \list and IED lists override this. +% However, \trivlist will use this as will most +% things built from \trivlist like the \center +% environment. +\topsep 0.5\baselineskip + +% Controls the additional spacing around lists preceded +% or followed by blank lines. the IEEE does not increase +% spacing before or after paragraphs so it is set to zero. +% \z@ is the same as zero, but faster. +\partopsep \z@ + +% Controls the spacing between paragraphs in lists. +% The IEEE does not increase spacing before or after paragraphs +% so this is also zero. +% With IEEEtran.cls, global changes to +% this value DO affect lists (but not IED lists). +\parsep \z@ + +% Controls the extra spacing between list items. +% The IEEE does not put extra spacing between items. +% With IEEEtran.cls, global changes to this value DO affect +% lists (but not IED lists). +\itemsep \z@ + +% \itemindent is the amount to indent the FIRST line of a list +% item. It is auto set to zero within the \list environment. To alter +% it, you have to do so when you call the \list. +% However, the IEEE uses this for the theorem environment +% There is an alternative value for this near \leftmargini below +\itemindent -1em + +% \leftmargin, the spacing from the left margin of the main text to +% the left of the main body of a list item is set by \list. +% Hence this statement does nothing for lists. +% But, quote and verse do use it for indention. +\leftmargin 2em + +% we retain this stuff from the older IEEEtran.cls so that \list +% will work the same way as before. However, itemize, enumerate and +% description (IED) could care less about what these are as they +% all are overridden. +\leftmargini 2em +%\itemindent 2em % Alternative values: sometimes used. +%\leftmargini 0em +\leftmarginii 1em +\leftmarginiii 1.5em +\leftmarginiv 1.5em +\leftmarginv 1.0em +\leftmarginvi 1.0em +\labelsep 0.5em +\labelwidth \z@ + + +% The old IEEEtran.cls behavior of \list is retained. +% However, the new V1.3 IED list environments override all the +% @list stuff (\@listX is called within \list for the +% appropriate level just before the user's list_decl is called). +% \topsep is now 2pt as the IEEE puts a little extra space around +% lists - used by those non-IED macros that depend on \list. +% Note that \parsep and \itemsep are not redefined as in +% the sizexx.clo \@listX (which article.cls uses) so global changes +% of these values DO affect \list +% +\def\@listi{\leftmargin\leftmargini \topsep 2pt plus 1pt minus 1pt} +\let\@listI\@listi +\def\@listii{\leftmargin\leftmarginii\labelwidth\leftmarginii% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listiii{\leftmargin\leftmarginiii\labelwidth\leftmarginiii% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listiv{\leftmargin\leftmarginiv\labelwidth\leftmarginiv% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listv{\leftmargin\leftmarginv\labelwidth\leftmarginv% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listvi{\leftmargin\leftmarginvi\labelwidth\leftmarginvi% + \advance\labelwidth-\labelsep \topsep 2pt} + + +% The IEEE uses 5) not 5. +\def\labelenumi{\theenumi)} \def\theenumi{\arabic{enumi}} + +% The IEEE uses a) not (a) +\def\labelenumii{\theenumii)} \def\theenumii{\alph{enumii}} + +% The IEEE uses iii) not iii. +\def\labelenumiii{\theenumiii)} \def\theenumiii{\roman{enumiii}} + +% The IEEE uses A) not A. +\def\labelenumiv{\theenumiv)} \def\theenumiv{\Alph{enumiv}} + +% exactly the same as in article.cls +\def\p@enumii{\theenumi} +\def\p@enumiii{\theenumi(\theenumii)} +\def\p@enumiv{\p@enumiii\theenumiii} + +% itemized list label styles +\def\labelitemi{$\scriptstyle\bullet$} +\def\labelitemii{\textbf{--}} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + + + +% **** V1.3 ENHANCEMENTS **** +% Itemize, Enumerate and Description (IED) List Controls +% *************************** +% +% +% The IEEE seems to use at least two different values by +% which ITEMIZED list labels are indented to the right +% For The Journal of Lightwave Technology (JLT) and The Journal +% on Selected Areas in Communications (JSAC), they tend to use +% an indention equal to \parindent. For Transactions on Communications +% they tend to indent ITEMIZED lists a little more--- 1.3\parindent. +% We'll provide both values here for you so that you can choose +% which one you like in your document using a command such as: +% setlength{\IEEEilabelindent}{\IEEEilabelindentB} +\newdimen\IEEEilabelindentA +\IEEEilabelindentA \parindent + +\newdimen\IEEEilabelindentB +\IEEEilabelindentB 1.3\parindent +% However, we'll default to using \parindent +% which makes more sense to me +\newdimen\IEEEilabelindent +\IEEEilabelindent \IEEEilabelindentA + + +% This controls the default amount the enumerated list labels +% are indented to the right. +% Normally, this is the same as the paragraph indention +\newdimen\IEEEelabelindent +\IEEEelabelindent \parindent + +% This controls the default amount the description list labels +% are indented to the right. +% Normally, this is the same as the paragraph indention +\newdimen\IEEEdlabelindent +\IEEEdlabelindent \parindent + +% This is the value actually used within the IED lists. +% The IED environments automatically set its value to +% one of the three values above, so global changes do +% not have any effect +\newdimen\IEEElabelindent +\IEEElabelindent \parindent + +% The actual amount labels will be indented is +% \IEEElabelindent multiplied by the factor below +% corresponding to the level of nesting depth +% This provides a means by which the user can +% alter the effective \IEEElabelindent for deeper +% levels +% There may not be such a thing as correct "standard IEEE" +% values. What the IEEE actually does may depend on the specific +% circumstances. +% The first list level almost always has full indention. +% The second levels I've seen have only 75% of the normal indentation +% Three level or greater nestings are very rare. I am guessing +% that they don't use any indentation. +\def\IEEElabelindentfactori{1.0} % almost always one +\def\IEEElabelindentfactorii{0.75} % 0.0 or 1.0 may be used in some cases +\def\IEEElabelindentfactoriii{0.0} % 0.75? 0.5? 0.0? +\def\IEEElabelindentfactoriv{0.0} +\def\IEEElabelindentfactorv{0.0} +\def\IEEElabelindentfactorvi{0.0} + +% value actually used within IED lists, it is auto +% set to one of the 6 values above +% global changes here have no effect +\def\IEEElabelindentfactor{1.0} + +% This controls the default spacing between the end of the IED +% list labels and the list text, when normal text is used for +% the labels. +% compsoc uses a larger value here, but we'll set that later +% in the class so that this code block area can be extracted +% as-is for IEEEtrantools.sty +\newdimen\IEEEiednormlabelsep +\IEEEiednormlabelsep 0.6em + +% This controls the default spacing between the end of the IED +% list labels and the list text, when math symbols are used for +% the labels (nomenclature lists). The IEEE usually increases the +% spacing in these cases +\newdimen\IEEEiedmathlabelsep +\IEEEiedmathlabelsep 1.2em + +% This controls the extra vertical separation put above and +% below each IED list. the IEEE usually puts a little extra spacing +% around each list. However, this spacing is barely noticeable. +% compsoc uses a larger value here, but we'll set that later +% in the class so that this code block area can be extracted +% as-is for IEEEtrantools.sty +\newskip\IEEEiedtopsep +\IEEEiedtopsep 2pt plus 1pt minus 1pt + + +% This command is executed within each IED list environment +% at the beginning of the list. You can use this to set the +% parameters for some/all your IED list(s) without disturbing +% global parameters that affect things other than lists. +% i.e., renewcommand{\IEEEiedlistdecl}{\setlength{\labelsep}{5em}} +% will alter the \labelsep for the next list(s) until +% \IEEEiedlistdecl is redefined. +\def\IEEEiedlistdecl{\relax} + +% This command provides an easy way to set \leftmargin based +% on the \labelwidth, \labelsep and the argument \IEEElabelindent +% Usage: \IEEEcalcleftmargin{width-to-indent-the-label} +% output is in the \leftmargin variable, i.e., effectively: +% \leftmargin = argument + \labelwidth + \labelsep +% Note controlled spacing here, shield end of lines with % +\def\IEEEcalcleftmargin#1{\setlength{\leftmargin}{#1}% +\addtolength{\leftmargin}{\labelwidth}% +\addtolength{\leftmargin}{\labelsep}} + +% This command provides an easy way to set \labelwidth to the +% width of the given text. It is the same as +% \settowidth{\labelwidth}{label-text} +% and useful as a shorter alternative. +% Typically used to set \labelwidth to be the width +% of the longest label in the list +\def\IEEEsetlabelwidth#1{\settowidth{\labelwidth}{#1}} + +% When this command is executed, IED lists will use the +% IEEEiedmathlabelsep label separation rather than the normal +% spacing. To have an effect, this command must be executed via +% the \IEEEiedlistdecl or within the option of the IED list +% environments. +\def\IEEEusemathlabelsep{\setlength{\labelsep}{\IEEEiedmathlabelsep}} + +% A flag which controls whether the IED lists automatically +% calculate \leftmargin from \IEEElabelindent, \labelwidth and \labelsep +% Useful if you want to specify your own \leftmargin +% This flag must be set (\IEEEnocalcleftmargintrue or \IEEEnocalcleftmarginfalse) +% via the \IEEEiedlistdecl or within the option of the IED list +% environments to have an effect. +\newif\ifIEEEnocalcleftmargin +\IEEEnocalcleftmarginfalse + +% A flag which controls whether \IEEElabelindent is multiplied by +% the \IEEElabelindentfactor for each list level. +% This flag must be set via the \IEEEiedlistdecl or within the option +% of the IED list environments to have an effect. +\newif\ifIEEEnolabelindentfactor +\IEEEnolabelindentfactorfalse + + +% internal variable to indicate type of IED label +% justification +% 0 - left; 1 - center; 2 - right +\def\@IEEEiedjustify{0} + + +% commands to allow the user to control IED +% label justifications. Use these commands within +% the IED environment option or in the \IEEEiedlistdecl +% Note that changing the normal list justifications +% is nonstandard and the IEEE may not like it if you do so! +% I include these commands as they may be helpful to +% those who are using these enhanced list controls for +% other non-IEEE related LaTeX work. +% itemize and enumerate automatically default to right +% justification, description defaults to left. +\def\IEEEiedlabeljustifyl{\def\@IEEEiedjustify{0}}%left +\def\IEEEiedlabeljustifyc{\def\@IEEEiedjustify{1}}%center +\def\IEEEiedlabeljustifyr{\def\@IEEEiedjustify{2}}%right + + + + +% commands to save to and restore from the list parameter copies +% this allows us to set all the list parameters within +% the list_decl and prevent \list (and its \@list) +% from overriding any of our parameters +% V1.6 use \edefs instead of dimen's to conserve dimen registers +% Note controlled spacing here, shield end of lines with % +\def\@IEEEsavelistparams{\edef\@IEEEiedtopsep{\the\topsep}% +\edef\@IEEEiedlabelwidth{\the\labelwidth}% +\edef\@IEEEiedlabelsep{\the\labelsep}% +\edef\@IEEEiedleftmargin{\the\leftmargin}% +\edef\@IEEEiedpartopsep{\the\partopsep}% +\edef\@IEEEiedparsep{\the\parsep}% +\edef\@IEEEieditemsep{\the\itemsep}% +\edef\@IEEEiedrightmargin{\the\rightmargin}% +\edef\@IEEEiedlistparindent{\the\listparindent}% +\edef\@IEEEieditemindent{\the\itemindent}} + +% Note controlled spacing here +\def\@IEEErestorelistparams{\topsep\@IEEEiedtopsep\relax% +\labelwidth\@IEEEiedlabelwidth\relax% +\labelsep\@IEEEiedlabelsep\relax% +\leftmargin\@IEEEiedleftmargin\relax% +\partopsep\@IEEEiedpartopsep\relax% +\parsep\@IEEEiedparsep\relax% +\itemsep\@IEEEieditemsep\relax% +\rightmargin\@IEEEiedrightmargin\relax% +\listparindent\@IEEEiedlistparindent\relax% +\itemindent\@IEEEieditemindent\relax} + + +% v1.6b provide original LaTeX IED list environments +% note that latex.ltx defines \itemize and \enumerate, but not \description +% which must be created by the base classes +% save original LaTeX itemize and enumerate +\let\LaTeXitemize\itemize +\let\endLaTeXitemize\enditemize +\let\LaTeXenumerate\enumerate +\let\endLaTeXenumerate\endenumerate + +% provide original LaTeX description environment from article.cls +\newenvironment{LaTeXdescription} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\newcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} + + +% override LaTeX's default IED lists +\def\itemize{\@IEEEitemize} +\def\enditemize{\@endIEEEitemize} +\def\enumerate{\@IEEEenumerate} +\def\endenumerate{\@endIEEEenumerate} +\def\description{\@IEEEdescription} +\def\enddescription{\@endIEEEdescription} + +% provide the user with aliases - may help those using packages that +% override itemize, enumerate, or description +\def\IEEEitemize{\@IEEEitemize} +\def\endIEEEitemize{\@endIEEEitemize} +\def\IEEEenumerate{\@IEEEenumerate} +\def\endIEEEenumerate{\@endIEEEenumerate} +\def\IEEEdescription{\@IEEEdescription} +\def\endIEEEdescription{\@endIEEEdescription} + + +% V1.6 we want to keep the IEEEtran IED list definitions as our own internal +% commands so they are protected against redefinition +\def\@IEEEitemize{\@ifnextchar[{\@@IEEEitemize}{\@@IEEEitemize[\relax]}} +\def\@IEEEenumerate{\@ifnextchar[{\@@IEEEenumerate}{\@@IEEEenumerate[\relax]}} +\def\@IEEEdescription{\@ifnextchar[{\@@IEEEdescription}{\@@IEEEdescription[\relax]}} +\def\@endIEEEitemize{\endlist} +\def\@endIEEEenumerate{\endlist} +\def\@endIEEEdescription{\endlist} + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran itemized list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEitemize[#1]{% + \ifnum\@itemdepth>3\relax\@toodeep\else% + \ifnum\@listdepth>5\relax\@toodeep\else% + \advance\@itemdepth\@ne% + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{2}% right justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEilabelindent% + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % calculate the label width + % the user can override this later if + % they specified a \labelwidth + \settowidth{\labelwidth}{\csname labelitem\romannumeral\the\@itemdepth\endcsname}% + \@IEEEsavelistparams% save our list parameters + \list{\csname\@itemitem\endcsname}{% + \@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % IEEElabelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}% + \fi}\fi\fi}% + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran enumerate list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEenumerate[#1]{% + \ifnum\@enumdepth>3\relax\@toodeep\else% + \ifnum\@listdepth>5\relax\@toodeep\else% + \advance\@enumdepth\@ne% + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{2}% right justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEelabelindent% + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % calculate the label width + % We'll set it to the width suitable for all labels using + % normalfont 1) to 9) + % The user can override this later + \settowidth{\labelwidth}{9)}% + \@IEEEsavelistparams% save our list parameters + \list{\csname label\@enumctr\endcsname}{\usecounter{\@enumctr}% + \@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % IEEElabelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}% + \fi}\fi\fi}% + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran description list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEdescription[#1]{% + \ifnum\@listdepth>5\relax\@toodeep\else% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{0}% left justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEdlabelindent% + % assume normal labelsep + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % Bogus label width in case the user forgets + % to set it. + % TIP: If you want to see what a variable's width is you + % can use the TeX command \showthe\width-variable to + % display it on the screen during compilation + % (This might be helpful to know when you need to find out + % which label is the widest) + \settowidth{\labelwidth}{Hello}% + \@IEEEsavelistparams% save our list parameters + \list{}{\@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % labelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}\relax% + \fi}\fi} + +% v1.6b we use one makelabel that does justification as needed. +\def\@IEEEiedmakelabel#1{\relax\if\@IEEEiedjustify 0\relax +\makebox[\labelwidth][l]{\normalfont #1}\else +\if\@IEEEiedjustify 1\relax +\makebox[\labelwidth][c]{\normalfont #1}\else +\makebox[\labelwidth][r]{\normalfont #1}\fi\fi} + + +% compsoc uses a larger value for the normal labelsep +% and also extra spacing above and below each list +\ifCLASSOPTIONcompsoc + \IEEEiednormlabelsep 1.2em + \IEEEiedtopsep 6pt plus 3pt minus 3pt +\fi + + +% VERSE and QUOTE +% V1.7 define environments with newenvironment +\newenvironment{verse}{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em \listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item\relax} + {\endlist} +\newenvironment{quotation}{\list{}{\listparindent 1.5em \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item\relax} + {\endlist} +\newenvironment{quote}{\list{}{\rightmargin\leftmargin}\item\relax} + {\endlist} + + +% \titlepage +% provided only for backward compatibility. \maketitle is the correct +% way to create the title page. +\def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \else \newpage \fi \thispagestyle{empty}\c@page\z@} +\def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi} + +% standard values from article.cls +\arraycolsep 5pt +\arrayrulewidth .4pt +\doublerulesep 2pt + +\tabcolsep 6pt +\tabbingsep 0.5em + + +%% FOOTNOTES +% +%\skip\footins 10pt plus 4pt minus 2pt +% V1.6 respond to changes in font size +% space added above the footnotes (if present) +\skip\footins 0.9\baselineskip plus 0.4\baselineskip minus 0.2\baselineskip + +% V1.6, we need to make \footnotesep responsive to changes +% in \baselineskip or strange spacings will result when in +% draft mode. Here is a little LaTeX secret - \footnotesep +% determines the height of an invisible strut that is placed +% *above* the baseline of footnotes after the first. Since +% LaTeX considers the space for characters to be 0.7\baselineskip +% above the baseline and 0.3\baselineskip below it, we need to +% use 0.7\baselineskip as a \footnotesep to maintain equal spacing +% between all the lines of the footnotes. The IEEE often uses a tad +% more, so use 0.8\baselineskip. This slightly larger value also helps +% the text to clear the footnote marks. Note that \thanks in IEEEtran +% uses its own value of \footnotesep which is set in \maketitle. +{\footnotesize +\global\footnotesep 0.8\baselineskip} + + +\skip\@mpfootins = \skip\footins +\fboxsep = 3pt +\fboxrule = .4pt +% V1.6 use 1em, then use LaTeX2e's \@makefnmark +% Note that the IEEE normally *left* aligns the footnote marks, so we don't need +% box resizing tricks here. +\long\def\@makefntext#1{\parindent 1em\indent\hbox{\@makefnmark}#1}% V1.6 use 1em +% V1.7 compsoc does not use superscipts for footnote marks +\ifCLASSOPTIONcompsoc +\def\@IEEEcompsocmakefnmark{\hbox{\normalfont\@thefnmark.\ }} +\long\def\@makefntext#1{\parindent 1em\indent\hbox{\@IEEEcompsocmakefnmark}#1} +\fi + +% The IEEE does not use footnote rules +\def\footnoterule{} + +% V1.7 for compsoc, the IEEE uses a footnote rule only for \thanks. We devise a "one-shot" +% system to implement this. +\newif\if@IEEEenableoneshotfootnoterule +\@IEEEenableoneshotfootnoterulefalse +\ifCLASSOPTIONcompsoc +\def\footnoterule{\relax\if@IEEEenableoneshotfootnoterule +\kern-5pt +\hbox to \columnwidth{\hfill\vrule width 0.5\columnwidth height 0.4pt\hfill} +\kern4.6pt +\global\@IEEEenableoneshotfootnoterulefalse +\else +\relax +\fi} +\fi + +% V1.6 do not allow LaTeX to break a footnote across multiple pages +\interfootnotelinepenalty=10000 + +% V1.6 discourage breaks within equations +% Note that amsmath normally sets this to 10000, +% but LaTeX2e normally uses 100. +\interdisplaylinepenalty=2500 + +% default allows section depth up to /paragraph +\setcounter{secnumdepth}{4} + +% technotes do not allow /paragraph +\ifCLASSOPTIONtechnote + \setcounter{secnumdepth}{3} +\fi +% neither do compsoc conferences +\@IEEEcompsocconfonly{\setcounter{secnumdepth}{3}} + + +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] + +% used only by IEEEtran's IEEEeqnarray as other packages may +% have their own, different, implementations +\newcounter{IEEEsubequation}[equation] + +% as shown when called by user from \ref, \label and in table of contents +\def\theequation{\arabic{equation}} % 1 +\def\theIEEEsubequation{\theequation\alph{IEEEsubequation}} % 1a (used only by IEEEtran's IEEEeqnarray) +\ifCLASSOPTIONcompsoc +% compsoc is all arabic +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} +\else +\def\thesection{\Roman{section}} % I +% V1.7, \mbox prevents breaks around - +\def\thesubsection{\mbox{\thesection-\Alph{subsection}}} % I-A +% V1.7 use I-A1 format used by the IEEE rather than I-A.1 +\def\thesubsubsection{\thesubsection\arabic{subsubsection}} % I-A1 +\def\theparagraph{\thesubsubsection\alph{paragraph}} % I-A1a +\fi + +% From Heiko Oberdiek. Because of the \mbox in \thesubsection, we need to +% tell hyperref to disable the \mbox command when making PDF bookmarks. +% This done already with hyperref.sty version 6.74o and later, but +% it will not hurt to do it here again for users of older versions. +\@ifundefined{pdfstringdefPreHook}{\let\pdfstringdefPreHook\@empty}{}% +\g@addto@macro\pdfstringdefPreHook{\let\mbox\relax} + + +% Main text forms (how shown in main text headings) +% V1.6, using \thesection in \thesectiondis allows changes +% in the former to automatically appear in the latter +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONconference% compsoc conference + \def\thesectiondis{\thesection.} + \def\thesubsectiondis{\thesectiondis\arabic{subsection}.} + \def\thesubsubsectiondis{\thesubsectiondis\arabic{subsubsection}.} + \def\theparagraphdis{\thesubsubsectiondis\arabic{paragraph}.} + \else% compsoc not conferencs + \def\thesectiondis{\thesection} + \def\thesubsectiondis{\thesectiondis.\arabic{subsection}} + \def\thesubsubsectiondis{\thesubsectiondis.\arabic{subsubsection}} + \def\theparagraphdis{\thesubsubsectiondis.\arabic{paragraph}} + \fi +\else% not compsoc + \def\thesectiondis{\thesection.} % I. + \def\thesubsectiondis{\Alph{subsection}.} % B. + \def\thesubsubsectiondis{\arabic{subsubsection})} % 3) + \def\theparagraphdis{\alph{paragraph})} % d) +\fi + +% just like LaTeX2e's \@eqnnum +\def\theequationdis{{\normalfont \normalcolor (\theequation)}}% (1) +% IEEEsubequation used only by IEEEtran's IEEEeqnarray +\def\theIEEEsubequationdis{{\normalfont \normalcolor (\theIEEEsubequation)}}% (1a) +% redirect LaTeX2e's equation number display and all that depend on +% it, through IEEEtran's \theequationdis +\def\@eqnnum{\theequationdis} + + + +% V1.7 provide string macros as article.cls does +\def\contentsname{Contents} +\def\listfigurename{List of Figures} +\def\listtablename{List of Tables} +\def\refname{References} +\def\indexname{Index} +\def\figurename{Fig.} +\def\tablename{TABLE} +\@IEEEcompsocconfonly{\def\figurename{Figure}} +\def\partname{Part} +\def\appendixname{Appendix} +\def\abstractname{Abstract} +% IEEE specific names +\def\IEEEkeywordsname{Index Terms} +\def\IEEEproofname{Proof} + + +% LIST OF FIGURES AND TABLES AND TABLE OF CONTENTS +% +\def\@pnumwidth{1.55em} +\def\@tocrmarg{2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +% adjusted some spacings here so that section numbers will not easily +% collide with the section titles. +% VIII; VIII-A; and VIII-A.1 are usually the worst offenders. +% MDS 1/2001 +\def\tableofcontents{\section*{\contentsname}\@starttoc{toc}} +\def\l@section#1#2{\addpenalty{\@secpenalty}\addvspace{1.0em plus 1pt}% + \@tempdima 2.75em \begingroup \parindent \z@ \rightskip \@pnumwidth% + \parfillskip-\@pnumwidth {\bfseries\leavevmode #1}\hfil\hbox to\@pnumwidth{\hss #2}\par% + \endgroup} +% argument format #1:level, #2:labelindent,#3:labelsep +\def\l@subsection{\@dottedtocline{2}{2.75em}{3.75em}} +\def\l@subsubsection{\@dottedtocline{3}{6.5em}{4.5em}} +% must provide \l@ defs for ALL sublevels EVEN if tocdepth +% is such as they will not appear in the table of contents +% these defs are how TOC knows what level these things are! +\def\l@paragraph{\@dottedtocline{4}{6.5em}{5.5em}} +\def\l@subparagraph{\@dottedtocline{5}{6.5em}{6.5em}} +\def\listoffigures{\section*{\listfigurename}\@starttoc{lof}} +\def\l@figure{\@dottedtocline{1}{0em}{2.75em}} +\def\listoftables{\section*{\listtablename}\@starttoc{lot}} +\let\l@table\l@figure + + +% Definitions for floats +% +% Normal Floats +% V1.8 floatsep et al. revised down by 0.15\baselineskip +% to account for the sideeffects of \topskip compensation +\floatsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip +\textfloatsep 1.55\baselineskip plus 0.2\baselineskip minus 0.4\baselineskip +\@fptop 0pt plus 1fil +\@fpsep 0.75\baselineskip plus 2fil +\@fpbot 0pt plus 1fil +\def\topfraction{0.9} +\def\bottomfraction{0.4} +\def\floatpagefraction{0.8} +% V1.7, let top floats approach 90% of page +\def\textfraction{0.1} + +% Double Column Floats +\dblfloatsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip + +\dbltextfloatsep 1.55\baselineskip plus 0.2\baselineskip minus 0.4\baselineskip +% Note that it would be nice if the rubber here actually worked in LaTeX2e. +% There is a long standing limitation in LaTeX, first discovered (to the best +% of my knowledge) by Alan Jeffrey in 1992. LaTeX ignores the stretchable +% portion of \dbltextfloatsep, and as a result, double column figures can and +% do result in an non-integer number of lines in the main text columns with +% underfull vbox errors as a consequence. A post to comp.text.tex +% by Donald Arseneau confirms that this had not yet been fixed in 1998. +% IEEEtran V1.6 will fix this problem for you in the titles, but it doesn't +% protect you from other double floats. Happy vspace'ing. + +\@dblfptop 0pt plus 1fil +\@dblfpsep 0.75\baselineskip plus 2fil +\@dblfpbot 0pt plus 1fil +\def\dbltopfraction{0.8} +\def\dblfloatpagefraction{0.8} +\setcounter{dbltopnumber}{4} + +\intextsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} + + + +% article class provides these, we should too. +\newlength\abovecaptionskip +\newlength\belowcaptionskip +% but only \abovecaptionskip is used above figure captions and *below* table +% captions +\setlength\abovecaptionskip{0.5\baselineskip} +% compsoc journals are a little more generous +\ifCLASSOPTIONcompsoc\ifCLASSOPTIONjournal + \setlength\abovecaptionskip{0.75\baselineskip} +\fi\fi +\setlength\belowcaptionskip{0pt} +% V1.6 create hooks in case the caption spacing ever needs to be +% overridden by a user +\def\@IEEEfigurecaptionsepspace{\vskip\abovecaptionskip\relax}% +\def\@IEEEtablecaptionsepspace{\vskip\abovecaptionskip\relax}% + + +% 1.6b revise caption system so that \@makecaption uses two arguments +% as with LaTeX2e. Otherwise, there will be problems when using hyperref. +\def\@IEEEtablestring{table} + + +% V1.8 compensate for \topskip so top of top figures align with tops of the first lines of main text +% here we calculate a space equal to the amount \topskip exceeds the main text height +% we hook in at \@floatboxreset +\def\@IEEEfiguretopskipspace{\ifdim\prevdepth=-1000pt\relax +\setlength{\@IEEEtrantmpdimenA}{1\topskip}\relax +\addtolength{\@IEEEtrantmpdimenA}{-0.7\@IEEEnormalsizeunitybaselineskip}\relax +\vspace*{\@IEEEtrantmpdimenA}\fi} +% V1.8 compensate for \topskip at the top of top tables so caption text is on main text baseline +% use a strut set on the caption baseline within \@makecaption +\def\@IEEEtabletopskipstrut{\ifdim\prevdepth=-1000pt\rule{0pt}{\topskip}\fi} +% the \ifdim\prevdepth checks are always expected to be true for IEEE style float caption ordering +% because top of figure content and top of captions in tables is the first thing on the vertical +% list of these floats +% thanks to Donald Arseneau for his 2000/11/11 post "Re: caption hacking" with info on this topic. + + +\ifCLASSOPTIONcompsoc +% V1.7 compsoc \@makecaption +\ifCLASSOPTIONconference% compsoc conference +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize {#1.}\nobreakspace\scshape #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\footnotesize \noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, center +\else% +\hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}% +\fi\fi} +% +\else% nonconference compsoc +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\sffamily\footnotesize #1}\\{\normalfont\sffamily\footnotesize #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +\setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\sffamily\footnotesize \noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, left justify +\else% +\hbox to\hsize{\normalfont\sffamily\footnotesize\box\@tempboxa\hfil}% +\fi\fi} +\fi +% +\else% traditional noncompsoc \@makecaption +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize #1}\\{\normalfont\footnotesize\scshape #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +% 3/2001 use footnotesize, not small; use two nonbreaking spaces, not one +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\footnotesize\noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, center if conference, left justify otherwise +\else% +\ifCLASSOPTIONconference \hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}% +\else \hbox to\hsize{\normalfont\footnotesize\box\@tempboxa\hfil}% +\fi\fi\fi} +\fi + + + +% V1.7 disable captions class option, do so in a way that retains operation of \label +% within \caption +\ifCLASSOPTIONcaptionsoff +\long\def\@makecaption#1#2{\vspace*{2em}\footnotesize\bgroup\par\addvspace{0.5\baselineskip}\centering{\footnotesize #1}\par\addvspace{0.5\baselineskip}\egroup% +\let\@IEEEtemporiglabeldefsave\label +\let\@IEEEtemplabelargsave\relax +\def\label##1{\gdef\@IEEEtemplabelargsave{##1}}% +\setbox\@tempboxa\hbox{#2}% +\let\label\@IEEEtemporiglabeldefsave +\ifx\@IEEEtemplabelargsave\relax\else\label{\@IEEEtemplabelargsave}\fi} +\fi + + +% V1.7 define end environments with \def not \let so as to work OK with +% preview-latex +\newcounter{figure} +\def\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename\nobreakspace\thefigure} +% V1.8 within figures add \@IEEEfiguretopskipspace compensation to LaTeX2e's \@floatboxreset +\def\figure{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@float{figure}} +\def\endfigure{\end@float} +% V1.8 also add \@IEEEfiguretopskipspace compensation to \figure* +\@namedef{figure*}{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\newcounter{table} +\ifCLASSOPTIONcompsoc +\def\thetable{\arabic{table}} +\else +\def\thetable{\@Roman\c@table} +\fi +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\nobreakspace\thetable} +% V1.6 The IEEE uses 8pt text for tables +% within tables alter LaTeX2e's \@floatboxreset to use \footnotesize +\def\table{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@float{table}} +\def\endtable{\end@float} +% v1.6b double column tables need to default to footnotesize as well. +\@namedef{table*}{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + + + + +%% -- Command Argument Scanning Support Functions -- +%% V1.8a + +% usage: \@IEEEstripouterbraces*{} +% \@IEEEstripouterbraces fully expands its argument (which it then stores +% in \@IEEEstripouterbracesarg) via \edef, then removes any outer enclosing +% braces, and finally stores the result in the macro +% \@IEEEstrippedouterbraces. +% +% For example: +% \@IEEEstripouterbraces{{{{ab}c}}} +% results in: +% +% \@IEEEstripouterbracesarg ==> a macro containing {{{ab}c}} +% \@IEEEstrippedouterbraces ==> a macro containing {ab}c +% +% the *-star form,\@IEEEstripouterbraces*, does not expand the argument +% contents during processing +\def\@IEEEstripouterbraces{\@ifstar{\let\@IEEEstripouterbracesdef=\def\@@IEEEstripouterbraces}{\let\@IEEEstripouterbracesdef=\edef\@@IEEEstripouterbraces}} + +\def\@@IEEEstripouterbraces#1{\@IEEEstripouterbracesdef\@IEEEstripouterbracesarg{#1}\relax +% If the macro is unchanged after being acquired as a single delimited +% argument, we know we have one sequence of tokens without any enclosing +% braces. Loop until this is true. +\loop + \expandafter\@@@IEEEstripouterbraces\@IEEEstripouterbracesarg\@IEEEgeneralsequenceDELIMITER +\ifx\@IEEEstrippedouterbraces\@IEEEstripouterbracesarg +\else + \let\@IEEEstripouterbracesarg\@IEEEstrippedouterbraces +\repeat} + +\def\@@@IEEEstripouterbraces#1\@IEEEgeneralsequenceDELIMITER{\def\@IEEEstrippedouterbraces{#1}} + + + +% usage: \@IEEEextractgroup*{} +% \@IEEEextractgroup fully expands its argument (which it then stores in +% \@IEEEextractgrouparg) via \edef and then assigns the first "brace group" +% of tokens to the macro \@IEEEextractedgroup. +% The remaining groups, if any, are stored in the macro +% \@IEEEextractedgroupremain. If the argument does not contain the requisite +% groups, the respective macros will be defined to be empty. +% There is an asymmetry in that \@IEEEextractedgroup is stripped of its first +% outer grouping while \@IEEEextractedgroupremain retains even the outer +% grouping (if present) that originally identified it as a group. +% +% For example: +% \@IEEEextractgroup{{{ab}}{c{de}}} +% results in: +% +% \@IEEEextractgrouparg ==> a macro containing {{ab}}{c{de}} +% \@IEEEextractedgroup ==> a macro containing {ab} +% \@IEEEextractedgroupremain ==> a macro containing {c{de}} +% +% The *-star form, \@IEEEextractgroup*, does not expand its argument +% contents during processing. +\def\@IEEEextractgroup{\@ifstar{\let\@IEEEextractgroupdef=\def\@@IEEEextractgroup}{\let\@IEEEextractgroupdef=\edef\@@IEEEextractgroup}} + +\def\@@IEEEextractgroup#1{\@IEEEextractgroupdef\@IEEEextractgrouparg{#1}\relax +% trap the case of an empty extracted group as this would cause problems with +% \@IEEEextractgroupremain's argument acquisition +\ifx\@IEEEextractgrouparg\@empty + \def\@IEEEextractedgroup{}\relax + \def\@IEEEextractedgroupremain{}\relax +\else + % We have to use some dirty tricks here. We want to insert {} around + % whatever remains after the first group so that TeX's argument scanner + % will preserve any originally enclosing braces as well as provide an + % empty argument to acquire even if there isn't a second group. + % In this first of two dirty tricks, we put a } at the end of the structure + % we are going to extract from. The \ifnum0=`{\fi keeps TeX happy to allow + % what would otherwise be an unbalanced macro definition for + % \@@IEEEextractgroup to be acceptable to it. + \ifnum0=`{\fi\expandafter\@IEEEextractgroupremain\@IEEEextractgrouparg}\relax +\fi} + +% In the second part of the dirty tricks, we insert a leading { right after +% the first group is acquired, but before the remainder is. Again, the +% \ifnum0=`}\fi keeps TeX happy during definition time, but will disappear +% during run time. +\def\@IEEEextractgroupremain#1{\def\@IEEEextractedgroup{#1}\expandafter\@@IEEEextractgroupremain\expandafter{\ifnum0=`}\fi} + +\def\@@IEEEextractgroupremain#1{\def\@IEEEextractedgroupremain{#1}} + + + +% \@IEEEextracttoken relocated at top because margin setting commands rely on it + + + +% usage: \@IEEEextracttokengroups*{} +% \@IEEEextracttokengroups fully expands its argument (which it then stores +% in \@IEEEextracttokengroupsarg) and then assigns the first "brace group" of +% tokens (with the outermost braces removed) to the macro +% \@IEEEextractedfirstgroup. +% The meaning of the first nonbrace (but including the empty group) token +% within this first group is assigned via \let to \@IEEEextractedfirsttoken +% as well as stored in the macro \@IEEEextractedfirsttokenmacro. If a first +% nonbrace token does not exist (or is an empty group), these will be \relax +% and empty, respectively. Tokens that would otherwise be discarded during +% the acquisition of the first token in the first group are stored in +% \@IEEEextractedfirsttokensdiscarded, however their original relative brace +% nesting depths are not guaranteed to be preserved. +% The first group within this first group is stored in the macro +% \@IEEEextractedfirstfirstgroup. +% Likewise for the next group after the first: \@IEEEextractednextgroup, +% \@IEEEextractednextfirstgroup, \@IEEEextractednextgroupfirsttoken, +% \@IEEEextractednextgroupfirsttokenmacro, and +% \@IEEEextractednextfirsttokensdiscarded. +% All tokens/groups after the first group, including any enclosing braces, +% are stored in the macro \@IEEEextractedafterfirstgroupremain which will +% be empty if none exist. +% +% For example: +% \@IEEEextracttokengroups{{{ab}{cd}}{{ef}g}} +% will result in: +% +% \@IEEEextracttokengroupsarg ==> a macro containing {{ab}{cd}}{{ef}g} +% \@IEEEextractedfirstgroup ==> a macro containing {ab}{cd} +% \@IEEEextractedafterfirstgroupremain ==> a macro containing {{ef}g} +% \@IEEEextractedfirsttoken ==> the letter a +% \@IEEEextractedfirsttokenmacro ==> a macro containing a +% \@IEEEextractedfirsttokensdiscarded ==> a macro containing bcd +% \@IEEEextractedfirstfirstgroup ==> a macro containing ab +% \@IEEEextractednextgroup ==> a macro containing {ef}g +% \@IEEEextractednextfirsttoken ==> the letter e +% \@IEEEextractednextfirsttokenmacro ==> a macro containing e +% \@IEEEextractednextfirsttokensdiscarded ==> a macro containing fg +% \@IEEEextractednextfirstgroup ==> a macro containing ef +% +% If given an empty argument, \@IEEEextractedfirsttoken and +% \@IEEEextractednextfirsttoken will be set to \relax +% and all the macros will be empty. +% the *-star form, \@IEEEextracttokengroups*, does not expand its argument +% contents during processing. +% +% Depends on: \@IEEEextractgroup, \@IEEEextracttoken +\def\@IEEEextracttokengroups{\@ifstar{\let\@IEEEextracttokengroupsdef=\def\@@IEEEextracttokengroups}{\let\@IEEEextracttokengroupsdef=\edef\@@IEEEextracttokengroups}} +\def\@@IEEEextracttokengroups#1{\@IEEEextracttokengroupsdef\@IEEEextracttokengroupsarg{#1}\relax +% begin extraction, these functions are safe with empty arguments +% first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextracttokengroupsarg}\relax +\let\@IEEEextractedfirstgroup\@IEEEextractedgroup +\let\@IEEEextractedafterfirstgroupremain\@IEEEextractedgroupremain +\expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax +\let\@IEEEextractedfirsttoken\@IEEEextractedtoken +\let\@IEEEextractedfirsttokenmacro\@IEEEextractedtokenmacro +\let\@IEEEextractedfirsttokensdiscarded\@IEEEextractedtokensdiscarded +% first first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax +\let\@IEEEextractedfirstfirstgroup\@IEEEextractedgroup +% next group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedafterfirstgroupremain}\relax +\let\@IEEEextractednextgroup\@IEEEextractedgroup +\expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractednextgroup}\relax +\let\@IEEEextractednextfirsttoken\@IEEEextractedtoken +\let\@IEEEextractednextfirsttokenmacro\@IEEEextractedtokenmacro +\let\@IEEEextractednextfirsttokensdiscarded\@IEEEextractedtokensdiscarded +% next first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractednextgroup}\relax +\let\@IEEEextractednextfirstgroup\@IEEEextractedgroup} + + +%% -- End of Command Argument Scanning Support Functions -- + + + + +%% +%% START OF IEEEeqnarray DEFINITIONS +%% +%% Inspired by the concepts, examples, and previous works of LaTeX +%% coders and developers such as Donald Arseneau, Fred Bartlett, +%% David Carlisle, Tony Liu, Frank Mittelbach, Piet van Oostrum, +%% Roland Winkler and Mark Wooding. +%% I don't make the claim that my work here is even near their calibre. ;) + + +\newif\if@IEEEeqnarrayboxnojot% flag to indicate if the environment was called as the star form +\@IEEEeqnarrayboxnojotfalse + +\newif\if@advanceIEEEeqncolcnt% tracks if the environment should advance the col counter +% allows a way to make an \IEEEeqnarraybox that can be used within an \IEEEeqnarray +% used by IEEEeqnarraymulticol so that it can work properly in both +\@advanceIEEEeqncolcnttrue + +\newcount\@IEEEeqnnumcols % tracks how many IEEEeqnarray cols are defined +\newcount\@IEEEeqncolcnt % tracks how many IEEEeqnarray cols the user actually used + + +% The default math style used by the columns +\def\IEEEeqnarraymathstyle{\displaystyle} +% The default text style used by the columns +% default to using the current font +\def\IEEEeqnarraytextstyle{\relax} + +% like the iedlistdecl but for \IEEEeqnarray +\def\IEEEeqnarraydecl{\relax} +\def\IEEEeqnarrayboxdecl{\relax} + + + +% V1.8 flags to indicate that equation numbering is to persist +\newif\if@IEEEeqnumpersist% +\@IEEEeqnumpersistfalse +\newif\if@IEEEsubeqnumpersist% +\@IEEEsubeqnumpersistfalse +% +% V1.8 flags to indicate if (sub)equation number of last line was preadvanced +\newif\if@IEEEeqnumpreadv% +\@IEEEeqnumpreadvfalse +\newif\if@IEEEsubeqnumpreadv% +\@IEEEsubeqnumpreadvfalse + +\newcount\@IEEEsubeqnnumrollback% saves previous value of IEEEsubequation number in case we need to restore it + +% \yesnumber is the opposite of \nonumber +% a novel concept with the same def as the equationarray package +% However, we give IEEE versions too since some LaTeX packages such as +% the MDWtools mathenv.sty redefine \nonumber to something else. +% This command is intended for use in non-IEEEeqnarray math environments +\providecommand{\yesnumber}{\global\@eqnswtrue} + + +% IEEEyes/nonumber +% V1.8 add persistant * forms +% These commands can alter the type of equation an IEEEeqnarray line is. +\def\IEEEyesnumber{\@ifstar{\global\@IEEEeqnumpersisttrue\global\@IEEEsubeqnumpersistfalse\@IEEEyesnumber}{\@IEEEyesnumber}} + +\def\@IEEEyesnumber{\global\@eqnswtrue +\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray +\ifnum\c@IEEEsubequation>0\relax + \stepcounter{equation}\setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label +\fi +% even if we reached this eqn num via a preadv, it is legit now +\global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse +\fi} + +\def\IEEEnonumber{\@ifstar{\global\@IEEEeqnumpersistfalse\global\@IEEEsubeqnumpersistfalse\global\@eqnswfalse}{\global\@eqnswfalse}} + + +\def\IEEEyessubnumber{\@ifstar{\global\@IEEEsubeqnumpersisttrue\@IEEEyessubnumber}{\@IEEEyessubnumber}} +% +\def\@IEEEyessubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray + \ifnum\c@IEEEsubequation>0\relax% if it already is a subequation, we are good to go as-is + \else% if we are a regular equation we have to watch out for two cases + \if@IEEEeqnumpreadv% if this equation is the result of a preadvance, backout and bump the sub eqnnum + \global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\addtocounter{IEEEsubequation}{1}\relax + \else% non-preadvanced equations just need initialization of their sub eqnnum + \setcounter{IEEEsubequation}{1}\relax + \fi + \fi% fi already is subequation + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore + \global\@eqnswtrue +\fi} + + +\def\IEEEnosubnumber{\@ifstar{\global\@IEEEsubeqnumpersistfalse\@IEEEnosubnumber}{\@IEEEnosubnumber}} +% +\def\@IEEEnosubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray + \if@eqnsw % we do nothing unless we know we will display because we play with the counters here + % if it currently is a subequation, bump up to the next equation number and turn off the subequation + \ifnum\c@IEEEsubequation>0\relax\addtocounter{equation}{1}\setcounter{IEEEsubequation}{0}\relax + \fi + \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore + \gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi +\fi} + + + +% allows users to "push away" equations that get too close to the equation numbers +\def\IEEEeqnarraynumspace{\hphantom{\ifnum\c@IEEEsubequation>0\relax\theIEEEsubequationdis\else\theequationdis\fi}} + +% provides a way to span multiple columns within IEEEeqnarray environments +% will consider \if@advanceIEEEeqncolcnt before globally advancing the +% column counter - so as to work within \IEEEeqnarraybox +% usage: \IEEEeqnarraymulticol{number cols. to span}{col type}{cell text} +\long\def\IEEEeqnarraymulticol#1#2#3{\multispan{#1}\relax +% check if column is defined for the precolumn definition +% We have to be careful here because TeX scans for & even within an \iffalse +% where it does not expand macros. So, if we used only one \ifx and a #3 +% appeared in the false branch and the user inserted another alignment +% structure that uses & in the \IEEEeqnarraymulticol{}, TeX will not see that +% there is an inner alignment in the false branch yet still will see any & +% there and will think that they apply to the outer alignment resulting in an +% incomplete \ifx error. +% So, here we use separate checks for the pre and post parts in order to keep +% the #3 outside of all conditionals. +\relax\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax +\csname @IEEEeqnarraycolPRE#2\endcsname +\else% if not, error and use default type +\@IEEEclspkgerror{Invalid column type "#2" in \string\IEEEeqnarraymulticol.\MessageBreak +Using a default centering column instead}% +{You must define IEEEeqnarray column types before use.}% +\csname @IEEEeqnarraycolPRE@IEEEdefault\endcsname +\fi +% The ten \relax are to help prevent misleading error messages in case a user +% accidently inserted a macro that tries to acquire additional arguments. +#3\relax\relax\relax\relax\relax\relax\relax\relax\relax\relax +% check if column is defined for the postcolumn definition +\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax +\csname @IEEEeqnarraycolPOST#2\endcsname +\else% if not, use the default type +\csname @IEEEeqnarraycolPOST@IEEEdefault\endcsname +\fi +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by #1\relax\fi} + +% like \omit, but maintains track of the column counter for \IEEEeqnarray +\def\IEEEeqnarrayomit{\omit\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by 1\relax\fi} + + +% provides a way to define a letter referenced column type +% usage: \IEEEeqnarraydefcol{col. type letter/name}{pre insertion text}{post insertion text} +\def\IEEEeqnarraydefcol#1#2#3{\expandafter\def\csname @IEEEeqnarraycolPRE#1\endcsname{#2}% +\expandafter\def\csname @IEEEeqnarraycolPOST#1\endcsname{#3}% +\expandafter\def\csname @IEEEeqnarraycolDEF#1\endcsname{1}} + + +% provides a way to define a numerically referenced inter-column glue types +% usage: \IEEEeqnarraydefcolsep{col. glue number}{glue definition} +\def\IEEEeqnarraydefcolsep#1#2{\expandafter\def\csname @IEEEeqnarraycolSEP\romannumeral #1\endcsname{#2}% +\expandafter\def\csname @IEEEeqnarraycolSEPDEF\romannumeral #1\endcsname{1}} + + +\def\@IEEEeqnarraycolisdefined{1}% just a macro for 1, used for checking undefined column types + + +% expands and appends the given argument to the \@IEEEtrantmptoksA token list +% used to build up the \halign preamble +\def\@IEEEappendtoksA#1{\edef\@@IEEEappendtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA #1}}% +\@@IEEEappendtoksA} + +% also appends to \@IEEEtrantmptoksA, but does not expand the argument +% uses \toks8 as a scratchpad register +\def\@IEEEappendNOEXPANDtoksA#1{\toks8={#1}% +\edef\@@IEEEappendNOEXPANDtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA\the\toks8}}% +\@@IEEEappendNOEXPANDtoksA} + +% define some common column types for the user +% math +\IEEEeqnarraydefcol{l}{$\IEEEeqnarraymathstyle}{$\hfil} +\IEEEeqnarraydefcol{c}{\hfil$\IEEEeqnarraymathstyle}{$\hfil} +\IEEEeqnarraydefcol{r}{\hfil$\IEEEeqnarraymathstyle}{$} +\IEEEeqnarraydefcol{L}{$\IEEEeqnarraymathstyle{}}{{}$\hfil} +\IEEEeqnarraydefcol{C}{\hfil$\IEEEeqnarraymathstyle{}}{{}$\hfil} +\IEEEeqnarraydefcol{R}{\hfil$\IEEEeqnarraymathstyle{}}{{}$} +% text +\IEEEeqnarraydefcol{s}{\IEEEeqnarraytextstyle}{\hfil} +\IEEEeqnarraydefcol{t}{\hfil\IEEEeqnarraytextstyle}{\hfil} +\IEEEeqnarraydefcol{u}{\hfil\IEEEeqnarraytextstyle}{} + +% vertical rules +\IEEEeqnarraydefcol{v}{}{\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{vv}{\vrule width\arrayrulewidth\hfil}{\hfil\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{V}{}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{VV}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth\hfil}% +{\hfil\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth} + +% horizontal rules +\IEEEeqnarraydefcol{h}{}{\leaders\hrule height\arrayrulewidth\hfil} +\IEEEeqnarraydefcol{H}{}{\leaders\vbox{\hrule width\arrayrulewidth\vskip\doublerulesep\hrule width\arrayrulewidth}\hfil} + +% plain +\IEEEeqnarraydefcol{x}{}{} +\IEEEeqnarraydefcol{X}{$}{$} + +% the default column type to use in the event a column type is not defined +\IEEEeqnarraydefcol{@IEEEdefault}{\hfil$\IEEEeqnarraymathstyle}{$\hfil} + + +% a zero tabskip (used for "-" col types) +\def\@IEEEeqnarraycolSEPzero{0pt plus 0pt minus 0pt} +% a centering tabskip (used for "+" col types) +\def\@IEEEeqnarraycolSEPcenter{1000pt plus 0pt minus 1000pt} + +% top level default tabskip glues for the start, end, and inter-column +% may be reset within environments not always at the top level, e.g., \IEEEeqnarraybox +\edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPcenter}% default start glue +\edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPcenter}% default end glue +\edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue + + + +% creates a vertical rule that extends from the bottom to the top a a cell +% Provided in case other packages redefine \vline some other way. +% usage: \IEEEeqnarrayvrule[rule thickness] +% If no argument is provided, \arrayrulewidth will be used for the rule thickness. +\newcommand\IEEEeqnarrayvrule[1][\arrayrulewidth]{\vrule\@width#1\relax} + +% creates a blank separator row +% usage: \IEEEeqnarrayseprow[separation length][font size commands] +% default is \IEEEeqnarrayseprow[0.25\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers +\def\IEEEeqnarrayseprow{\relax\@ifnextchar[{\@IEEEeqnarrayseprow}{\@IEEEeqnarrayseprow[0.25\normalbaselineskip]}} +\def\@IEEEeqnarrayseprow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprow[#1]}{\@@IEEEeqnarrayseprow[#1][\relax]}} +\def\@@IEEEeqnarrayseprow[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}% +\ifx\@IEEEeqnarrayseprowARGONE\@empty% +% get the skip value, based on the font commands +% use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3 +% assign within a bogus box to confine the font changes +{\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}% +\else% +{\setbox0=\hbox{#2\relax\global\skip5=#1}}% +\fi% +\@IEEEeqnarrayhoptolastcolumn\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax} + +% creates a blank separator row, but omits all the column templates +% usage: \IEEEeqnarrayseprowcut[separation length][font size commands] +% default is \IEEEeqnarrayseprowcut[0.25\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers +\def\IEEEeqnarrayseprowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarrayseprowcut}{\@IEEEeqnarrayseprowcut[0.25\normalbaselineskip]}} +\def\@IEEEeqnarrayseprowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprowcut[#1]}{\@@IEEEeqnarrayseprowcut[#1][\relax]}} +\def\@@IEEEeqnarrayseprowcut[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}% +\ifx\@IEEEeqnarrayseprowARGONE\@empty% +% get the skip value, based on the font commands +% use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3 +% assign within a bogus box to confine the font changes +{\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}% +\else% +{\setbox0=\hbox{#2\relax\global\skip5=#1}}% +\fi% +\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax} + + + +% draws a single rule across all the columns optional +% argument determines the rule width, \arrayrulewidth is the default +% updates column counter as needed and turns off struts +% usage: \IEEEeqnarrayrulerow[rule line thickness] +\def\IEEEeqnarrayrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarrayrulerow}{\@IEEEeqnarrayrulerow[\arrayrulewidth]}} +\def\@IEEEeqnarrayrulerow[#1]{\leaders\hrule height#1\hfil\relax% put in our rule +% turn off any struts +\IEEEeqnarraystrutsize{0pt}{0pt}[\relax]\relax} + + +% draws a double rule by using a single rule row, a separator row, and then +% another single rule row +% first optional argument determines the rule thicknesses, \arrayrulewidth is the default +% second optional argument determines the rule spacing, \doublerulesep is the default +% usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing] +\def\IEEEeqnarraydblrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarraydblrulerow}{\@IEEEeqnarraydblrulerow[\arrayrulewidth]}} +\def\@IEEEeqnarraydblrulerow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerow[#1]}% +{\@@IEEEeqnarraydblrulerow[#1][\doublerulesep]}} +\def\@@IEEEeqnarraydblrulerow[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}% +% we allow the user to say \IEEEeqnarraydblrulerow[][] +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]\relax% +\fi% +\def\@IEEEeqnarraydblrulerowARG{#2}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\\\IEEEeqnarrayseprow[\doublerulesep][\relax]% +\else% +\\\IEEEeqnarrayseprow[#2][\relax]% +\fi% +\\\multispan{\@IEEEeqnnumcols}% +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\def\@IEEEeqnarraydblrulerowARG{#1}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +} + +% draws a double rule by using a single rule row, a separator (cutting) row, and then +% another single rule row +% first optional argument determines the rule thicknesses, \arrayrulewidth is the default +% second optional argument determines the rule spacing, \doublerulesep is the default +% usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing] +\def\IEEEeqnarraydblrulerowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarraydblrulerowcut}{\@IEEEeqnarraydblrulerowcut[\arrayrulewidth]}} +\def\@IEEEeqnarraydblrulerowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerowcut[#1]}% +{\@@IEEEeqnarraydblrulerowcut[#1][\doublerulesep]}} +\def\@@IEEEeqnarraydblrulerowcut[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}% +% we allow the user to say \IEEEeqnarraydblrulerow[][] +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +\def\@IEEEeqnarraydblrulerowARG{#2}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\\\IEEEeqnarrayseprowcut[\doublerulesep][\relax]% +\else% +\\\IEEEeqnarrayseprowcut[#2][\relax]% +\fi% +\\\multispan{\@IEEEeqnnumcols}% +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\def\@IEEEeqnarraydblrulerowARG{#1}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +} + + + +% inserts a full row's worth of &'s +% relies on \@IEEEeqnnumcols to provide the correct number of columns +% uses \@IEEEtrantmptoksA, \count0 as scratch registers +\def\@IEEEeqnarrayhoptolastcolumn{\@IEEEtrantmptoksA={}\count0=1\relax% +\loop% add cols if the user did not use them all +\ifnum\count0<\@IEEEeqnnumcols\relax% +\@IEEEappendtoksA{&}% +\advance\count0 by 1\relax% update the col count +\repeat% +\the\@IEEEtrantmptoksA%execute the &'s +} + + + +\newif\if@IEEEeqnarrayISinner % flag to indicate if we are within the lines +\@IEEEeqnarrayISinnerfalse % of an IEEEeqnarray - after the IEEEeqnarraydecl + +\edef\@IEEEeqnarrayTHEstrutheight{0pt} % height and depth of IEEEeqnarray struts +\edef\@IEEEeqnarrayTHEstrutdepth{0pt} + +\edef\@IEEEeqnarrayTHEmasterstrutheight{0pt} % default height and depth of +\edef\@IEEEeqnarrayTHEmasterstrutdepth{0pt} % struts within an IEEEeqnarray + +\edef\@IEEEeqnarrayTHEmasterstrutHSAVE{0pt} % saved master strut height +\edef\@IEEEeqnarrayTHEmasterstrutDSAVE{0pt} % and depth + +\newif\if@IEEEeqnarrayusemasterstrut % flag to indicate that the master strut value +\@IEEEeqnarrayusemasterstruttrue % is to be used + + + +% saves the strut height and depth of the master strut +\def\@IEEEeqnarraymasterstrutsave{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% save values +\edef\@IEEEeqnarrayTHEmasterstrutHSAVE{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutDSAVE{\the\dimen2}} + +% restores the strut height and depth of the master strut +\def\@IEEEeqnarraymasterstrutrestore{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutHSAVE\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutDSAVE\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% restore values +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}} + + +% globally restores the strut height and depth to the +% master values and sets the master strut flag to true +\def\@IEEEeqnarraystrutreset{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% restore values +\xdef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\xdef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\global\@IEEEeqnarrayusemasterstruttrue} + + +% if the master strut is not to be used, make the current +% values of \@IEEEeqnarrayTHEstrutheight, \@IEEEeqnarrayTHEstrutdepth +% and the use master strut flag, global +% this allows user strut commands issued in the last column to be carried +% into the isolation/strut column +\def\@IEEEeqnarrayglobalizestrutstatus{\relax% +\if@IEEEeqnarrayusemasterstrut\else% +\xdef\@IEEEeqnarrayTHEstrutheight{\@IEEEeqnarrayTHEstrutheight}% +\xdef\@IEEEeqnarrayTHEstrutdepth{\@IEEEeqnarrayTHEstrutdepth}% +\global\@IEEEeqnarrayusemasterstrutfalse% +\fi} + + + +% usage: \IEEEeqnarraystrutsize{height}{depth}[font size commands] +% If called outside the lines of an IEEEeqnarray, sets the height +% and depth of both the master and local struts. If called inside +% an IEEEeqnarray line, sets the height and depth of the local strut +% only and sets the flag to indicate the use of the local strut +% values. If the height or depth is left blank, 0.7\normalbaselineskip +% and 0.3\normalbaselineskip will be used, respectively. +% The optional argument can be used to evaluate the lengths under +% a different font size and styles. If none is specified, the current +% font is used. +% uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2 +\def\IEEEeqnarraystrutsize#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsize{#1}{#2}}{\@IEEEeqnarraystrutsize{#1}{#2}[\relax]}} +\def\@IEEEeqnarraystrutsize#1#2[#3]{\def\@IEEEeqnarraystrutsizeARG{#1}% +\ifx\@IEEEeqnarraystrutsizeARG\@empty% +{\setbox0=\hbox{#3\relax\global\skip3=0.7\normalbaselineskip}}% +\skip0=\skip3\relax% +\else% arg one present +{\setbox0=\hbox{#3\relax\global\skip3=#1\relax}}% +\skip0=\skip3\relax% +\fi% if null arg +\def\@IEEEeqnarraystrutsizeARG{#2}% +\ifx\@IEEEeqnarraystrutsizeARG\@empty% +{\setbox0=\hbox{#3\relax\global\skip3=0.3\normalbaselineskip}}% +\skip2=\skip3\relax% +\else% arg two present +{\setbox0=\hbox{#3\relax\global\skip3=#2\relax}}% +\skip2=\skip3\relax% +\fi% if null arg +% remove stretchability, just to be safe +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +\if@IEEEeqnarrayISinner% inner does not touch master strut size +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstrutfalse% do not use master +\else% outer, have to set master strut too +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}% +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstruttrue% use master strut +\fi} + + +% usage: \IEEEeqnarraystrutsizeadd{added height}{added depth}[font size commands] +% If called outside the lines of an IEEEeqnarray, adds the given height +% and depth to both the master and local struts. +% If called inside an IEEEeqnarray line, adds the given height and depth +% to the local strut only and sets the flag to indicate the use +% of the local strut values. +% In both cases, if a height or depth is left blank, 0pt is used instead. +% The optional argument can be used to evaluate the lengths under +% a different font size and styles. If none is specified, the current +% font is used. +% uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2 +\def\IEEEeqnarraystrutsizeadd#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsizeadd{#1}{#2}}{\@IEEEeqnarraystrutsizeadd{#1}{#2}[\relax]}} +\def\@IEEEeqnarraystrutsizeadd#1#2[#3]{\def\@IEEEeqnarraystrutsizearg{#1}% +\ifx\@IEEEeqnarraystrutsizearg\@empty% +\skip0=0pt\relax% +\else% arg one present +{\setbox0=\hbox{#3\relax\global\skip3=#1}}% +\skip0=\skip3\relax% +\fi% if null arg +\def\@IEEEeqnarraystrutsizearg{#2}% +\ifx\@IEEEeqnarraystrutsizearg\@empty% +\skip2=0pt\relax% +\else% arg two present +{\setbox0=\hbox{#3\relax\global\skip3=#2}}% +\skip2=\skip3\relax% +\fi% if null arg +% remove stretchability, just to be safe +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +\if@IEEEeqnarrayISinner% inner does not touch master strut size +% get local strut size +\expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax% +% add it to the user supplied values +\advance\dimen0 by \skip0\relax% +\advance\dimen2 by \skip2\relax% +% update the local strut size +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstrutfalse% do not use master +\else% outer, have to set master strut too +% get master strut size +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% add it to the user supplied values +\advance\dimen0 by \skip0\relax% +\advance\dimen2 by \skip2\relax% +% update the local and master strut sizes +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}% +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstruttrue% use master strut +\fi} + + +% allow user a way to see the struts +\newif\ifIEEEvisiblestruts +\IEEEvisiblestrutsfalse + +% inserts an invisible strut using the master or local strut values +% uses scratch registers \skip0, \skip2, \dimen0, \dimen2 +\def\@IEEEeqnarrayinsertstrut{\relax% +\if@IEEEeqnarrayusemasterstrut +% get master strut size +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +\else% +% get local strut size +\expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax% +\fi% +% remove stretchability, probably not needed +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +% allow user to see struts if desired +\ifIEEEvisiblestruts% +\vrule width0.2pt height\dimen0 depth\dimen2\relax% +\else% +\vrule width0pt height\dimen0 depth\dimen2\relax\fi} + + +% creates an invisible strut, useable even outside \IEEEeqnarray +% if \IEEEvisiblestrutstrue, the strut will be visible and 0.2pt wide. +% usage: \IEEEstrut[height][depth][font size commands] +% default is \IEEEstrut[0.7\normalbaselineskip][0.3\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \dimen0, \dimen2, \skip0, \skip2 +\def\IEEEstrut{\relax\@ifnextchar[{\@IEEEstrut}{\@IEEEstrut[0.7\normalbaselineskip]}} +\def\@IEEEstrut[#1]{\relax\@ifnextchar[{\@@IEEEstrut[#1]}{\@@IEEEstrut[#1][0.3\normalbaselineskip]}} +\def\@@IEEEstrut[#1][#2]{\relax\@ifnextchar[{\@@@IEEEstrut[#1][#2]}{\@@@IEEEstrut[#1][#2][\relax]}} +\def\@@@IEEEstrut[#1][#2][#3]{\mbox{#3\relax% +\def\@IEEEstrutARG{#1}% +\ifx\@IEEEstrutARG\@empty% +\skip0=0.7\normalbaselineskip\relax% +\else% +\skip0=#1\relax% +\fi% +\def\@IEEEstrutARG{#2}% +\ifx\@IEEEstrutARG\@empty% +\skip2=0.3\normalbaselineskip\relax% +\else% +\skip2=#2\relax% +\fi% +% remove stretchability, probably not needed +\dimen0\skip0\relax% +\dimen2\skip2\relax% +\ifIEEEvisiblestruts% +\vrule width0.2pt height\dimen0 depth\dimen2\relax% +\else% +\vrule width0.0pt height\dimen0 depth\dimen2\relax\fi}} + + +% enables strut mode by setting a default strut size and then zeroing the +% \baselineskip, \lineskip, \lineskiplimit and \jot +\def\IEEEeqnarraystrutmode{\IEEEeqnarraystrutsize{0.7\normalbaselineskip}{0.3\normalbaselineskip}[\relax]% +\baselineskip=0pt\lineskip=0pt\lineskiplimit=0pt\jot=0pt} + + +% equation and subequation forms to use to setup hyperref's \@currentHref +\def\@IEEEtheHrefequation{equation.\theHequation} +\def\@IEEEtheHrefsubequation{equation.\theHequation\alph{IEEEsubequation}} + + +\def\IEEEeqnarray{\@IEEEeqnumpersisttrue\@IEEEsubeqnumpersistfalse\@IEEEeqnarray} +\def\endIEEEeqnarray{\end@IEEEeqnarray} + +\@namedef{IEEEeqnarray*}{\@IEEEeqnumpersistfalse\@IEEEsubeqnumpersistfalse\@IEEEeqnarray} +\@namedef{endIEEEeqnarray*}{\end@IEEEeqnarray} + + +% \IEEEeqnarray is an enhanced \eqnarray. +% The star form defaults to not putting equation numbers at the end of each row. +% usage: \IEEEeqnarray[decl]{cols} +\def\@IEEEeqnarray{\relax\@ifnextchar[{\@@IEEEeqnarray}{\@@IEEEeqnarray[\relax]}} +% We have to be careful here to normalize catcodes just before acquiring the +% cols as that specification may contain punctuation which could be subject +% to document catcode changes. +\def\@@IEEEeqnarray[#1]{\begingroup\IEEEnormalcatcodes\@@@IEEEeqnarray[#1]} +\def\@@@IEEEeqnarray[#1]#2{\endgroup + % default to showing the equation number or not based on whether or not + % the star form was involked + \if@IEEEeqnumpersist\global\@eqnswtrue + \else% not the star form + \global\@eqnswfalse + \fi% if star form + % provide a basic hyperref \theHequation if this has not already been setup (hyperref not loaded, or no section counter) + \@ifundefined{theHequation}{\def\theHequation{\arabic{equation}}}{}\relax + % provide dummy hyperref commands in case hyperref is not loaded + \providecommand{\Hy@raisedlink}[1]{}\relax + \providecommand{\hyper@anchorstart}[1]{}\relax + \providecommand{\hyper@anchorend}{}\relax + \providecommand{\@currentHref}{}\relax + \@IEEEeqnumpreadvfalse% reset eqnpreadv flag + \@IEEEsubeqnumpreadvfalse% reset subeqnpreadv flag + \@IEEEeqnarrayISinnerfalse% not yet within the lines of the halign + \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default + \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise + \IEEEvisiblestrutsfalse% diagnostic mode defaults to off + % no extra space unless the user specifically requests it + \lineskip=0pt\relax + \lineskiplimit=0pt\relax + \baselineskip=\normalbaselineskip\relax% + \jot=\IEEEnormaljot\relax% + \mathsurround\z@\relax% no extra spacing around math + \@advanceIEEEeqncolcnttrue% advance the col counter for each col the user uses, + % used in \IEEEeqnarraymulticol and in the preamble build + %V1.8 Here we preadvance to the next equation number. + % If the user later wants a continued subequation, we can roll back. + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation% + \stepcounter{equation}\@IEEEeqnumpreadvtrue% advance equation counter before first line + \setcounter{IEEEsubequation}{0}% no subequation yet + \let\@IEEEcurrentlabelsave\@currentlabel% save current label as we later change it globally + \let\@IEEEcurrentHrefsave\@currentHref% save current href label as we later change it globally + \def\@currentlabel{\p@equation\theequation}% redefine the ref label + \def\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \IEEEeqnarraydecl\relax% allow a way for the user to make global overrides + #1\relax% allow user to override defaults + \let\\\@IEEEeqnarraycr% replace newline with one that can put in eqn. numbers + \global\@IEEEeqncolcnt\z@% col. count = 0 for first line + \@IEEEbuildpreamble{#2}\relax% build the preamble and put it into \@IEEEtrantmptoksA + % put in the column for the equation number + \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first + \toks0={##}% + % advance the \@IEEEeqncolcnt for the isolation col, this helps with error checking + \@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}% + % add the isolation column + \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% + % advance the \@IEEEeqncolcnt for the equation number col, this helps with error checking + \@IEEEappendtoksA{&\global\advance\@IEEEeqncolcnt by 1\relax}% + % add the equation number col to the preamble + \@IEEEappendtoksA{\tabskip\z@skip\hb@xt@\z@\bgroup\hss\the\toks0\egroup}% + % note \@IEEEeqnnumcols does not count the equation col or isolation col + % set the starting tabskip glue as determined by the preamble build + \tabskip=\@IEEEBPstartglue\relax + % begin the display alignment + \@IEEEeqnarrayISinnertrue% commands are now within the lines + $$\everycr{}\halign to\displaywidth\bgroup + % "exspand" the preamble + \span\the\@IEEEtrantmptoksA\cr} + +% enter isolation/strut column (or the next column if the user did not use +% every column), record the strut status, complete the columns, do the strut if needed, +% restore counters (to backout any equation setup for a next line that was never used) +% to their correct values and exit +\def\end@IEEEeqnarray{\@IEEEeqnarrayglobalizestrutstatus&\@@IEEEeqnarraycr\egroup +\if@IEEEsubeqnumpreadv\global\advance\c@IEEEsubequation\m@ne\fi +\if@IEEEeqnumpreadv\global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\fi +\global\let\@currentlabel\@IEEEcurrentlabelsave% restore current label +\global\let\@currentHref\@IEEEcurrentHrefsave% restore current href label +$$\@ignoretrue} + + +% IEEEeqnarray uses a modifed \\ instead of the plain \cr to +% end rows. This allows for things like \\*[vskip amount] +% These "cr" macros are modified versions of those for LaTeX2e's eqnarray +% the {\ifnum0=`} braces must be kept away from the last column to avoid +% altering spacing of its math, so we use & to advance to the next column +% as there is an isolation/strut column after the user's columns +\def\@IEEEeqnarraycr{\@IEEEeqnarrayglobalizestrutstatus&% save strut status and advance to next column + {\ifnum0=`}\fi + \@ifstar{% + \global\@eqpen\@M\@IEEEeqnarrayYCR + }{% + \global\@eqpen\interdisplaylinepenalty \@IEEEeqnarrayYCR + }% +} + +\def\@IEEEeqnarrayYCR{\@testopt\@IEEEeqnarrayXCR\z@skip} + +\def\@IEEEeqnarrayXCR[#1]{% + \ifnum0=`{\fi}% + \@@IEEEeqnarraycr + \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}}% + +\def\@@IEEEeqnarraycr{\@IEEEtrantmptoksA={}% clear token register + \advance\@IEEEeqncolcnt by -1\relax% adjust col count because of the isolation column + \ifnum\@IEEEeqncolcnt>\@IEEEeqnnumcols\relax + \@IEEEclspkgerror{Too many columns within the IEEEeqnarray\MessageBreak + environment}% + {Use fewer \string &'s or put more columns in the IEEEeqnarray column\MessageBreak + specifications.}\relax% + \else + \loop% add cols if the user did not use them all + \ifnum\@IEEEeqncolcnt<\@IEEEeqnnumcols\relax + \@IEEEappendtoksA{&}% + \advance\@IEEEeqncolcnt by 1\relax% update the col count + \repeat + % this number of &'s will take us the the isolation column + \fi + % execute the &'s + \the\@IEEEtrantmptoksA% + % handle the strut/isolation column + \@IEEEeqnarrayinsertstrut% do the strut if needed + \@IEEEeqnarraystrutreset% reset the strut system for next line or IEEEeqnarray + &% and enter the equation number column + \if@eqnsw% only if we display something + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}% start a hyperref anchor + \global\@IEEEeqnumpreadvfalse\relax% displaying an equation number means + \global\@IEEEsubeqnumpreadvfalse\relax% the equation counters point to valid equations + % V1.8 Here we setup the counters, currentlabel and status for what would be the *next* + % equation line as would be the case under the current settings. However, there are two problems. + % One problem is that there might not ever be a next line. The second problem is that the user + % may later alter the meaning of a line with commands such as \IEEEyessubnumber. So, to handle + % these cases we have to record the current values of the (sub)equation counters and revert back + % to them if the next line is changed or never comes. The \if@IEEEeqnumpreadv, \if@IEEEsubeqnumpreadv + % and \@IEEEsubeqnnumrollback stuff tracks this. + % The logic to handle all this is surprisingly complex, but a nice feature of the approach here is + % that the equation counters and labels remain valid for what the line would be unless a + % \IEEEyessubnumber et al. later changes it. So, any hyperref links are always correct. + \ifnum\c@IEEEsubequation>0\relax% handle subequation + \theIEEEsubequationdis\relax + \if@IEEEsubeqnumpersist% setup for default type of next line + \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \else + % if no subeqnum persist, go ahead and setup for a new equation number + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation + \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax + \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi + \else% display a standard equation number + \theequationdis\relax + \setcounter{IEEEsubequation}{0}\relax% not really needed + \if@IEEEsubeqnumpersist% setup for default type of next line + % subequations that follow plain equations carry the same equation number e.g, 5, 5a rather than 5, 6a + \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \else + % if no subeqnum persist, go ahead and setup for a new equation number + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation + \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax + \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi + \fi% + \Hy@raisedlink{\hyper@anchorend}% end hyperref anchor + \fi% fi only if we display something + % reset the flags to indicate the default preferences of the display of equation numbers + \if@IEEEeqnumpersist\global\@eqnswtrue\else\global\@eqnswfalse\fi + \if@IEEEsubeqnumpersist\global\@eqnswtrue\fi% ditto for the subequation flag + % reset the number of columns the user actually used + \global\@IEEEeqncolcnt\z@\relax + % the real end of the line + \cr} + + + + + +% \IEEEeqnarraybox is like \IEEEeqnarray except the box form puts everything +% inside a vtop, vbox, or vcenter box depending on the letter in the second +% optional argument (t,b,c). Vbox is the default. Unlike \IEEEeqnarray, +% equation numbers are not displayed and \IEEEeqnarraybox can be nested. +% \IEEEeqnarrayboxm is for math mode (like \array) and does not put the vbox +% within an hbox. +% \IEEEeqnarrayboxt is for text mode (like \tabular) and puts the vbox within +% a \hbox{$ $} construct. +% \IEEEeqnarraybox will auto detect whether to use \IEEEeqnarrayboxm or +% \IEEEeqnarrayboxt depending on the math mode. +% The third optional argument specifies the width this box is to be set to - +% natural width is the default. +% The * forms do not add \jot line spacing +% usage: \IEEEeqnarraybox[decl][pos][width]{cols} +\def\IEEEeqnarrayboxm{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox} +\def\endIEEEeqnarrayboxm{\end@IEEEeqnarraybox} +\@namedef{IEEEeqnarrayboxm*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarrayboxm*}{\end@IEEEeqnarraybox} + +\def\IEEEeqnarrayboxt{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox} +\def\endIEEEeqnarrayboxt{\end@IEEEeqnarraybox} +\@namedef{IEEEeqnarrayboxt*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarrayboxt*}{\end@IEEEeqnarraybox} + +\def\IEEEeqnarraybox{\@IEEEeqnarrayboxnojotfalse\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi% +\@IEEEeqnarraybox} +\def\endIEEEeqnarraybox{\end@IEEEeqnarraybox} + +\@namedef{IEEEeqnarraybox*}{\@IEEEeqnarrayboxnojottrue\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi% +\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarraybox*}{\end@IEEEeqnarraybox} + +% flag to indicate if the \IEEEeqnarraybox needs to put things into an hbox{$ $} +% for \vcenter in non-math mode +\newif\if@IEEEeqnarrayboxHBOXSW% +\@IEEEeqnarrayboxHBOXSWfalse + +\def\@IEEEeqnarraybox{\relax\@ifnextchar[{\@@IEEEeqnarraybox}{\@@IEEEeqnarraybox[\relax]}} +% We have to be careful here to normalize catcodes just before acquiring the +% cols as that specification may contain punctuation which could be subject +% to document catcode changes. +\def\@@IEEEeqnarraybox[#1]{\relax\begingroup\IEEEnormalcatcodes\@ifnextchar[{\@@@IEEEeqnarraybox[#1]}{\@@@IEEEeqnarraybox[#1][b]}} +\def\@@@IEEEeqnarraybox[#1][#2]{\relax\@ifnextchar[{\@@@@IEEEeqnarraybox[#1][#2]}{\@@@@IEEEeqnarraybox[#1][#2][\relax]}} + +% #1 = decl; #2 = t,b,c; #3 = width, #4 = col specs +\def\@@@@IEEEeqnarraybox[#1][#2][#3]#4{\endgroup\@IEEEeqnarrayISinnerfalse % not yet within the lines of the halign + \@IEEEeqnarraymasterstrutsave% save current master strut values + \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default + \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise + \IEEEvisiblestrutsfalse% diagnostic mode defaults to off + % no extra space unless the user specifically requests it + \lineskip=0pt\relax% + \lineskiplimit=0pt\relax% + \baselineskip=\normalbaselineskip\relax% + \jot=\IEEEnormaljot\relax% + \mathsurround\z@\relax% no extra spacing around math + % the default end glues are zero for an \IEEEeqnarraybox + \edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPzero}% default start glue + \edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPzero}% default end glue + \edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue + \@advanceIEEEeqncolcntfalse% do not advance the col counter for each col the user uses, + % used in \IEEEeqnarraymulticol and in the preamble build + \IEEEeqnarrayboxdecl\relax% allow a way for the user to make global overrides + #1\relax% allow user to override defaults + \let\\\@IEEEeqnarrayboxcr% replace newline with one that allows optional spacing + \@IEEEbuildpreamble{#4}\relax% build the preamble and put it into \@IEEEtrantmptoksA + % add an isolation column to the preamble to stop \\'s {} from getting into the last col + \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first + \toks0={##}% + % add the isolation column to the preamble + \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% + % set the starting tabskip glue as determined by the preamble build + \tabskip=\@IEEEBPstartglue\relax + % begin the alignment + \everycr{}% + % use only the very first token to determine the positioning + \@IEEEextracttoken{#2}\relax + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: IEEEeqnarraybox position specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi + % \@IEEEextractedtoken has the first token, the rest are ignored + % if we need to put things into and hbox and go into math mode, do so now + \if@IEEEeqnarrayboxHBOXSW \leavevmode \hbox \bgroup $\fi% + % use the appropriate vbox type + \if\@IEEEextractedtoken t\relax\vtop\else\if\@IEEEextractedtoken c\relax% + \vcenter\else\vbox\fi\fi\bgroup% + \@IEEEeqnarrayISinnertrue% commands are now within the lines + \ifx#3\relax\halign\else\halign to #3\relax\fi% + \bgroup + % "exspand" the preamble + \span\the\@IEEEtrantmptoksA\cr} + +% carry strut status and enter the isolation/strut column, +% exit from math mode if needed, and exit +\def\end@IEEEeqnarraybox{\@IEEEeqnarrayglobalizestrutstatus% carry strut status +&% enter isolation/strut column +\@IEEEeqnarrayinsertstrut% do strut if needed +\@IEEEeqnarraymasterstrutrestore% restore the previous master strut values +% reset the strut system for next IEEEeqnarray +% (sets local strut values back to previous master strut values) +\@IEEEeqnarraystrutreset% +% ensure last line, exit from halign, close vbox +\crcr\egroup\egroup% +% exit from math mode and close hbox if needed +\if@IEEEeqnarrayboxHBOXSW $\egroup\fi} + + + +% IEEEeqnarraybox uses a modifed \\ instead of the plain \cr to +% end rows. This allows for things like \\[vskip amount] +% This "cr" macros are modified versions those for LaTeX2e's eqnarray +% For IEEEeqnarraybox, \\* is the same as \\ +% the {\ifnum0=`} braces must be kept away from the last column to avoid +% altering spacing of its math, so we use & to advance to the isolation/strut column +% carry strut status into isolation/strut column +\def\@IEEEeqnarrayboxcr{\@IEEEeqnarrayglobalizestrutstatus% carry strut status +&% enter isolation/strut column +\@IEEEeqnarrayinsertstrut% do strut if needed +% reset the strut system for next line or IEEEeqnarray +\@IEEEeqnarraystrutreset% +{\ifnum0=`}\fi% +\@ifstar{\@IEEEeqnarrayboxYCR}{\@IEEEeqnarrayboxYCR}} + +% test and setup the optional argument to \\[] +\def\@IEEEeqnarrayboxYCR{\@testopt\@IEEEeqnarrayboxXCR\z@skip} + +% IEEEeqnarraybox does not automatically increase line spacing by \jot +\def\@IEEEeqnarrayboxXCR[#1]{\ifnum0=`{\fi}% +\cr\noalign{\if@IEEEeqnarrayboxnojot\else\vskip\jot\fi\vskip#1\relax}} + + + +% usage: \@IEEEbuildpreamble{column specifiers} +% starts the halign preamble build +% the assembled preamble is put in \@IEEEtrantmptoksA +\def\@IEEEbuildpreamble#1{\@IEEEtrantmptoksA={}% clear token register +\let\@IEEEBPcurtype=u%current column type is not yet known +\let\@IEEEBPprevtype=s%the previous column type was the start +\let\@IEEEBPnexttype=u%next column type is not yet known +% ensure these are valid +\def\@IEEEBPcurglue={0pt plus 0pt minus 0pt}% +\def\@IEEEBPcurcolname{@IEEEdefault}% name of current column definition +% currently acquired numerically referenced glue +% use a name that is easier to remember +\let\@IEEEBPcurnum=\@IEEEtrantmpcountA% +\@IEEEBPcurnum=0% +% tracks number of columns in the preamble +\@IEEEeqnnumcols=0% +% record the default end glues +\edef\@IEEEBPstartglue{\@IEEEeqnarraycolSEPdefaultstart}% +\edef\@IEEEBPendglue{\@IEEEeqnarraycolSEPdefaultend}% +\edef\@IEEEedefMACRO{#1}\relax% fully expand the preamble to support macro containers +% now parse the user's column specifications +% \ignorespaces is used as a delimiter, need at least one trailing \relax because +% \@@IEEEbuildpreamble looks into the future +\expandafter\@@IEEEbuildpreamble\@IEEEedefMACRO\ignorespaces\relax\relax} + + +% usage: \@@IEEEbuildpreamble{current column}{next column} +% parses and builds the halign preamble +\def\@@IEEEbuildpreamble#1#2{\let\@@nextIEEEbuildpreamble=\@@IEEEbuildpreamble% +% use only the very first token to check the end +\@IEEEextracttokengroups{#1}\relax +\ifx\@IEEEextractedfirsttoken\ignorespaces\let\@@nextIEEEbuildpreamble=\@@IEEEfinishpreamble\else% +% identify current and next token type +\@IEEEgetcoltype{#1}{\@IEEEBPcurtype}{1}% current, error on invalid +\@IEEEgetcoltype{#2}{\@IEEEBPnexttype}{0}% next, no error on invalid next +% if curtype is a glue, get the glue def +\if\@IEEEBPcurtype g\@IEEEgetcurglue{#1}{\@IEEEBPcurglue}\fi% +% if curtype is a column, get the column def and set the current column name +\if\@IEEEBPcurtype c\@IEEEgetcurcol{#1}\fi% +% if curtype is a numeral, acquire the user defined glue +\if\@IEEEBPcurtype n\@IEEEprocessNcol{#1}\fi% +% process the acquired glue +\if\@IEEEBPcurtype g\@IEEEprocessGcol\fi% +% process the acquired col +\if\@IEEEBPcurtype c\@IEEEprocessCcol\fi% +% ready prevtype for next col spec. +\let\@IEEEBPprevtype=\@IEEEBPcurtype% +% be sure and put back the future token(s) as a group +\fi\@@nextIEEEbuildpreamble{#2}} + + +% usage: \@@IEEEfinishpreamble{discarded} +% executed just after preamble build is completed +% warn about zero cols, and if prevtype type = u, put in end tabskip glue +% argument is not used +\def\@@IEEEfinishpreamble#1{\ifnum\@IEEEeqnnumcols<1\relax +\@IEEEclspkgerror{No column specifiers declared for IEEEeqnarray}% +{At least one column type must be declared for each IEEEeqnarray.}% +\fi%num cols less than 1 +%if last type undefined, set default end tabskip glue +\if\@IEEEBPprevtype u\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue}\fi} + + +% usage: \@IEEEgetcoltype{col specifier}{\output}{error more} +% Identify and return the column specifier's type code in the given +% \output macro: +% n = number +% g = glue (any other char in catagory 12) +% c = letter +% e = \ignorespaces (end of sequence) +% u = undefined +% error mode: 0 = no error message, 1 = error on invalid char +\def\@IEEEgetcoltype#1#2#3{% +% use only the very first token to determine the type +\@IEEEextracttoken{#1}\relax +% \@IEEEextractedtoken has the first token, the rest are discarded +\let#2=u\relax% assume invalid until know otherwise +\ifx\@IEEEextractedtoken\ignorespaces\let#2=e\else +\ifcat\@IEEEextractedtoken\relax\else% screen out control sequences +\if0\@IEEEextractedtoken\let#2=n\else +\if1\@IEEEextractedtoken\let#2=n\else +\if2\@IEEEextractedtoken\let#2=n\else +\if3\@IEEEextractedtoken\let#2=n\else +\if4\@IEEEextractedtoken\let#2=n\else +\if5\@IEEEextractedtoken\let#2=n\else +\if6\@IEEEextractedtoken\let#2=n\else +\if7\@IEEEextractedtoken\let#2=n\else +\if8\@IEEEextractedtoken\let#2=n\else +\if9\@IEEEextractedtoken\let#2=n\else +\ifcat,\@IEEEextractedtoken\let#2=g\relax +\else\ifcat a\@IEEEextractedtoken\let#2=c\relax\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +\if#2u\relax +\if0\noexpand#3\relax\else\@IEEEclspkgerror{Invalid character in column specifications}% +{Only letters, numerals and certain other symbols are allowed \MessageBreak +as IEEEeqnarray column specifiers.}\fi\fi} + + +% usage: \@IEEEgetcurcol{col specifier} +% verify the letter referenced column exists +% and return its name in \@IEEEBPcurcolname +% if column specifier is invalid, use the default column @IEEEdefault +\def\@IEEEgetcurcol#1{\expandafter\ifx\csname @IEEEeqnarraycolDEF#1\endcsname\@IEEEeqnarraycolisdefined% +\def\@IEEEBPcurcolname{#1}\else% invalid column name +\@IEEEclspkgerror{Invalid column type "#1" in column specifications.\MessageBreak +Using a default centering column instead}% +{You must define IEEEeqnarray column types before use.}% +\def\@IEEEBPcurcolname{@IEEEdefault}\fi} + + +% usage: \@IEEEgetcurglue{glue specifier}{\output} +% identify the predefined (punctuation) glue value +% and return it in the given output macro +\def\@IEEEgetcurglue#1#2{% +% ! = \! (neg small) -0.16667em (-3/18 em) +% , = \, (small) 0.16667em ( 3/18 em) +% : = \: (med) 0.22222em ( 4/18 em) +% ; = \; (large) 0.27778em ( 5/18 em) +% ' = \quad 1em +% " = \qquad 2em +% . = 0.5\arraycolsep +% / = \arraycolsep +% ? = 2\arraycolsep +% * = 1fil +% + = \@IEEEeqnarraycolSEPcenter +% - = \@IEEEeqnarraycolSEPzero +% Note that all em values are referenced to the math font (textfont2) fontdimen6 +% value for 1em. +% +% use only the very first token to determine the type +\@IEEEextracttoken{#1}\relax +\ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: IEEEeqnarray predefined inter-column glue type specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax +\fi +% get the math font 1em value +% LaTeX2e's NFSS2 does not preload the fonts, but \IEEEeqnarray needs +% to gain access to the math (\textfont2) font's spacing parameters. +% So we create a bogus box here that uses the math font to ensure +% that \textfont2 is loaded and ready. If this is not done, +% the \textfont2 stuff here may not work. +% Thanks to Bernd Raichle for his 1997 post on this topic. +{\setbox0=\hbox{$\displaystyle\relax$}}% +% fontdimen6 has the width of 1em (a quad). +\@IEEEtrantmpdimenA=\fontdimen6\textfont2\relax% +% identify the glue value based on the first token +% we discard anything after the first +\if!\@IEEEextractedtoken\@IEEEtrantmpdimenA=-0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if,\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if:\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.22222\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if;\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.27778\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if'\@IEEEextractedtoken\@IEEEtrantmpdimenA=1\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if"\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if.\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.5\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else +\if/\@IEEEextractedtoken\edef#2{\the\arraycolsep}\else +\if?\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else +\if *\@IEEEextractedtoken\edef#2{0pt plus 1fil minus 0pt}\else +\if+\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPcenter}\else +\if-\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPzero}\else +\edef#2{\@IEEEeqnarraycolSEPzero}% +\@IEEEclspkgerror{Invalid predefined inter-column glue type "#1" in\MessageBreak +column specifications. Using a default value of\MessageBreak +0pt instead}% +{Only !,:;'"./?*+ and - are valid predefined glue types in the\MessageBreak +IEEEeqnarray column specifications.}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + + +% usage: \@IEEEprocessNcol{digit} +% process a numerical digit from the column specification +% and look up the corresponding user defined glue value +% can transform current type from n to g or a as the user defined glue is acquired +\def\@IEEEprocessNcol#1{\if\@IEEEBPprevtype g% +\@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak +specifications. Ignoring consecutive glue specifiers\MessageBreak +after the first}% +{You cannot have two or more glue types next to each other\MessageBreak +in the IEEEeqnarray column specifications.}% +\let\@IEEEBPcurtype=a% abort this glue, future digits will be discarded +\@IEEEBPcurnum=0\relax% +\else% if we previously aborted a glue +\if\@IEEEBPprevtype a\@IEEEBPcurnum=0\let\@IEEEBPcurtype=a%maintain digit abortion +\else%acquire this number +% save the previous type before the numerical digits started +\if\@IEEEBPprevtype n\else\let\@IEEEBPprevsavedtype=\@IEEEBPprevtype\fi% +\multiply\@IEEEBPcurnum by 10\relax% +\advance\@IEEEBPcurnum by #1\relax% add in number, \relax is needed to stop TeX's number scan +\if\@IEEEBPnexttype n\else%close acquisition +\expandafter\ifx\csname @IEEEeqnarraycolSEPDEF\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname\@IEEEeqnarraycolisdefined% +\edef\@IEEEBPcurglue{\csname @IEEEeqnarraycolSEP\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname}% +\else%user glue not defined +\@IEEEclspkgerror{Invalid user defined inter-column glue type "\number\@IEEEBPcurnum" in\MessageBreak +column specifications. Using a default value of\MessageBreak +0pt instead}% +{You must define all IEEEeqnarray numerical inter-column glue types via\MessageBreak +\string\IEEEeqnarraydefcolsep \space before they are used in column specifications.}% +\edef\@IEEEBPcurglue{\@IEEEeqnarraycolSEPzero}% +\fi% glue defined or not +\let\@IEEEBPcurtype=g% change the type to reflect the acquired glue +\let\@IEEEBPprevtype=\@IEEEBPprevsavedtype% restore the prev type before this number glue +\@IEEEBPcurnum=0\relax%ready for next acquisition +\fi%close acquisition, get glue +\fi%discard or acquire number +\fi%prevtype glue or not +} + + +% process an acquired glue +% add any acquired column/glue pair to the preamble +\def\@IEEEprocessGcol{\if\@IEEEBPprevtype a\let\@IEEEBPcurtype=a%maintain previous glue abortions +\else +% if this is the start glue, save it, but do nothing else +% as this is not used in the preamble, but before +\if\@IEEEBPprevtype s\edef\@IEEEBPstartglue{\@IEEEBPcurglue}% +\else%not the start glue +\if\@IEEEBPprevtype g%ignore if back to back glues +\@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak +specifications. Ignoring consecutive glue specifiers\MessageBreak +after the first}% +{You cannot have two or more glue types next to each other\MessageBreak +in the IEEEeqnarray column specifications.}% +\let\@IEEEBPcurtype=a% abort this glue +\else% not a back to back glue +\if\@IEEEBPprevtype c\relax% if the previoustype was a col, add column/glue pair to preamble +\ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi +\toks0={##}% +% make preamble advance col counter if this environment needs this +\if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi +% insert the column defintion into the preamble, being careful not to expand +% the column definition +\@IEEEappendtoksA{\tabskip=\@IEEEBPcurglue}% +\@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname}% +\@IEEEappendtoksA{\the\toks0}% +\@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\endgroup}% +\advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble +\else% error: non-start glue with no pending column +\@IEEEclspkgerror{Inter-column glue specifier without a prior column\MessageBreak +type in the column specifications. Ignoring this glue\MessageBreak +specifier}% +{Except for the first and last positions, glue can be placed only\MessageBreak +between column types.}% +\let\@IEEEBPcurtype=a% abort this glue +\fi% previous was a column +\fi% back-to-back glues +\fi% is start column glue +\fi% prev type not a +} + + +% process an acquired letter referenced column and, if necessary, add it to the preamble +\def\@IEEEprocessCcol{\if\@IEEEBPnexttype g\else +\if\@IEEEBPnexttype n\else +% we have a column followed by something other than a glue (or numeral glue) +% so we must add this column to the preamble now +\ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi%col separator for those after the first +\if\@IEEEBPnexttype e\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue\relax}\else%put in end glue +\@IEEEappendtoksA{\tabskip=\@IEEEeqnarraycolSEPdefaultmid\relax}\fi% or default mid glue +\toks0={##}% +% make preamble advance col counter if this environment needs this +\if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi +% insert the column definition into the preamble, being careful not to expand +% the column definition +\@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname}% +\@IEEEappendtoksA{\the\toks0}% +\@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\endgroup}% +\advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble +\fi%next type not numeral +\fi%next type not glue +} + + +%% +%% END OF IEEEeqnarray DEFINITIONS +%% + + + + + +% set up the running headers and footers +% +% header and footer font and size specifications +\def\@IEEEheaderstyle{\normalfont\scriptsize} +\def\@IEEEfooterstyle{\normalfont\scriptsize} +% +% compsoc uses sans-serif headers and footers +\ifCLASSOPTIONcompsoc + \def\@IEEEheaderstyle{\normalfont\sffamily\scriptsize} + \def\@IEEEfooterstyle{\normalfont\sffamily\scriptsize} +\fi + + +% standard page style, ps@headings +\def\ps@headings{% default to standard twoside headers, no footers +% will change later if the mode requires otherwise +\def\@oddhead{\hbox{}\@IEEEheaderstyle\rightmark\hfil\thepage}\relax +\def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\let\@oddfoot\@empty +\let\@evenfoot\@empty +\ifCLASSOPTIONtechnote + % technote twoside + \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax + \def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\fi +\ifCLASSOPTIONdraftcls + % draft footers + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax +\fi +% oneside +\if@twoside\else + % standard one side headers + \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax + \let\@evenhead\@empty + \ifCLASSOPTIONdraftcls + % oneside draft footers + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \let\@evenfoot\@empty + \fi +\fi +% turn off headers for conferences +\ifCLASSOPTIONconference + \let\@oddhead\@empty + \let\@evenhead\@empty +\fi +% turn off footers for draftclsnofoot +\ifCLASSOPTIONdraftclsnofoot + \let\@oddfoot\@empty + \let\@evenfoot\@empty +\fi} + + +% title page style, ps@IEEEtitlepagestyle +\def\ps@IEEEtitlepagestyle{% default title page headers, no footers +\def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax +\def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% will change later if the mode requires otherwise +\ifCLASSOPTIONdraftcls + % draft footers + \ifCLASSOPTIONdraftclsnofoot\else + % but only if not draftclsnofoot + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax + \fi +\else + % all nondraft mode footers + \if@IEEEusingpubid + % for title pages that are using a pubid + % do not repeat pubid on the title page if using a peer review cover page + \ifCLASSOPTIONpeerreview\else + % for noncompsoc papers, the pubid uses footnotesize and + % is at the same vertical position as where the last baseline would normally be + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \ifCLASSOPTIONcompsoc + % for compsoc papers, the pubid is at the same vertical position as the normal footer + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \fi + \fi + \fi +\fi +% turn off headers for conferences +\ifCLASSOPTIONconference + \let\@oddhead\@empty + \let\@evenhead\@empty +\fi} + + +% peer review cover page style, ps@IEEEpeerreviewcoverpagestyle +\def\ps@IEEEpeerreviewcoverpagestyle{% default peer review cover no headers, no footers +\let\@oddhead\@empty +\let\@evenhead\@empty +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% will change later if the mode requires otherwise +\ifCLASSOPTIONdraftcls + % draft footers + \ifCLASSOPTIONdraftclsnofoot\else + % but only if not draftclsnofoot + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax + \fi +\else + % all nondraft mode footers + \if@IEEEusingpubid + % for peer review cover pages that are using a pubid + % for noncompsoc papers, the pubid uses footnotesize and + % is at the same vertical position as where the last baseline would normally be + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \ifCLASSOPTIONcompsoc + % for compsoc papers, the pubid is at the same vertical position as the normal footer + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \fi + \fi +\fi} + + + +%% Defines the command for putting the header. +%% Note that all the text is forced into uppercase, if you have some text +%% that needs to be in lower case, for instance et. al., then either manually +%% set \leftmark and \rightmark or use \MakeLowercase{et. al.} within the +%% arguments to \markboth. +%% V1.7b add \protect to work with Babel +\def\markboth#1#2{\def\leftmark{\MakeUppercase{\protect#1}}% +\def\rightmark{\MakeUppercase{\protect#2}}} + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + + + + +%% CITATION AND BIBLIOGRAPHY COMMANDS +%% +%% V1.6 no longer supports the older, nonstandard \shortcite and \citename setup stuff +% +% +% Modify Latex2e \@citex to separate citations with "], [" +\def\@citex[#1]#2{% + \let\@citea\@empty + \@cite{\@for\@citeb:=#2\do + {\@citea\def\@citea{], [}% + \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% + \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi + \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\hbox{\csname b@\@citeb\endcsname}}}}{#1}} + +% V1.6 we create hooks for the optional use of Donald Arseneau's +% cite.sty package. cite.sty is "smart" and will notice that the +% following format controls are already defined and will not +% redefine them. The result will be the proper sorting of the +% citation numbers and auto detection of 3 or more entry "ranges" - +% all in IEEE style: [1], [2], [5]--[7], [12] +% This also allows for an optional note, i.e., \cite[mynote]{..}. +% If the \cite with note has more than one reference, the note will +% be applied to the last of the listed references. It is generally +% desired that if a note is given, only one reference is listed in +% that \cite. +% Thanks to Mr. Arseneau for providing the required format arguments +% to produce the IEEE style. +\def\citepunct{], [} +\def\citedash{]--[} + +% V1.7 default to using same font for urls made by url.sty +\AtBeginDocument{\csname url@samestyle\endcsname} + +% V1.6 class files should always provide these +\def\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +% V1.8b article.cls is now providing these too +% we do not use \@mkboth, nor alter the page style +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \twocolumn[\section*{\indexname}]% + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \columnseprule \z@ + \columnsep 35\p@ + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + + + +% Provide support for the control entries of IEEEtran.bst V1.00 and later. +% V1.7 optional argument allows for a different aux file to be specified in +% order to handle multiple bibliographies. For example, with multibib.sty: +% \newcites{sec}{Secondary Literature} +% \bstctlcite[@auxoutsec]{BSTcontrolhak} +\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}} +\def\@bstctlcite[#1]#2{\@bsphack + \@for\@citeb:=#2\do{% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}% + \@esphack} + +% \IEEEnoauxwrite{} allows for citations that do not add to or affect +% the order of the existing citation list. Can be useful for \cite +% within \thanks{}. +\DeclareRobustCommand{\IEEEnoauxwrite}[1]{\relax +\if@filesw +\@fileswfalse +#1\relax\relax\relax\relax\relax +\@fileswtrue +\else +#1\relax\relax\relax\relax\relax +\fi} + +% V1.6 provide a way for a user to execute a command just before +% a given reference number - used to insert a \newpage to balance +% the columns on the last page +\edef\@IEEEtriggerrefnum{0} % the default of zero means that + % the command is not executed +\def\@IEEEtriggercmd{\newpage} + +% allow the user to alter the triggered command +\long\def\IEEEtriggercmd#1{\long\def\@IEEEtriggercmd{#1}} + +% allow user a way to specify the reference number just before the +% command is executed +\def\IEEEtriggeratref#1{\@IEEEtrantmpcountA=#1% +\edef\@IEEEtriggerrefnum{\the\@IEEEtrantmpcountA}}% + +% trigger command at the given reference +\def\@IEEEbibitemprefix{\@IEEEtrantmpcountA=\@IEEEtriggerrefnum\relax% +\advance\@IEEEtrantmpcountA by -1\relax% +\ifnum\c@enumiv=\@IEEEtrantmpcountA\relax\@IEEEtriggercmd\relax\fi} + + +\def\@biblabel#1{[#1]} + +% compsoc journals and conferences left align the reference numbers +\@IEEEcompsoconly{\def\@biblabel#1{[#1]\hfill}} + +% controls bib item spacing +\def\IEEEbibitemsep{0pt plus .5pt} + +\@IEEEcompsocconfonly{\def\IEEEbibitemsep{0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}} + + +\def\thebibliography#1{\section*{\refname}% + \addcontentsline{toc}{section}{\refname}% + % V1.6 add some rubber space here and provide a command trigger + \footnotesize\vskip 0.3\baselineskip plus 0.1\baselineskip minus 0.1\baselineskip% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep\relax + \itemsep \IEEEbibitemsep\relax + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \let\@IEEElatexbibitem\bibitem% + \def\bibitem{\@IEEEbibitemprefix\@IEEElatexbibitem}% +\def\newblock{\hskip .11em plus .33em minus .07em}% +% originally: +% \sloppy\clubpenalty4000\widowpenalty4000% +% by adding the \interlinepenalty here, we make it more +% difficult, but not impossible, for LaTeX to break within a reference. +% The IEEE almost never breaks a reference (but they do it more often with +% technotes). You may get an underfull vbox warning around the bibliography, +% but the final result will be much more like what the IEEE will publish. +% MDS 11/2000 +\ifCLASSOPTIONtechnote\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty100% +\else\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty500\fi% + \sfcode`\.=1000\relax} +\let\endthebibliography=\endlist + + + + +% TITLE PAGE COMMANDS +% +% +% \IEEEmembership is used to produce the sublargesize italic font used to indicate author +% IEEE membership. compsoc uses a large size sans slant font +\def\IEEEmembership#1{{\@IEEEnotcompsoconly{\sublargesize}\normalfont\@IEEEcompsoconly{\sffamily}\textit{#1}}} + + +% \IEEEauthorrefmark{} produces a footnote type symbol to indicate author affiliation. +% When given an argument of 1 to 9, \IEEEauthorrefmark{} follows the standard LaTeX footnote +% symbol sequence convention. However, for arguments 10 and above, \IEEEauthorrefmark{} +% reverts to using lower case roman numerals, so it cannot overflow. Do note that you +% cannot use \footnotemark[] in place of \IEEEauthorrefmark{} within \author as the footnote +% symbols will have been turned off to prevent \thanks from creating footnote marks. +% \IEEEauthorrefmark{} produces a symbol that appears to LaTeX as having zero vertical +% height - this allows for a more compact line packing, but the user must ensure that +% the interline spacing is large enough to prevent \IEEEauthorrefmark{} from colliding +% with the text above. +% V1.7 make this a robust command +% V1.8 transmag uses an arabic author affiliation symbol +\ifCLASSOPTIONtransmag +\DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize #1}}} +\else +\DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize\ensuremath{\ifcase#1\or *\or \dagger\or \ddagger\or% + \mathsection\or \mathparagraph\or \|\or **\or \dagger\dagger% + \or \ddagger\ddagger \else\textsuperscript{\expandafter\romannumeral#1}\fi}}}} +\fi + + +% FONT CONTROLS AND SPACINGS FOR CONFERENCE MODE AUTHOR NAME AND AFFILIATION BLOCKS +% +% The default font styles for the author name and affiliation blocks (confmode) +\def\@IEEEauthorblockNstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize} +\def\@IEEEauthorblockAstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\@IEEEcompsocconfonly{\itshape}\normalsize} +% The default if the user does not use an author block +\def\@IEEEauthordefaulttextstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize} + +% adjustment spacing from title (or special paper notice) to author name blocks (confmode) +% can be negative +\def\@IEEEauthorblockconfadjspace{-0.25em} +% compsoc conferences need more space here +\@IEEEcompsocconfonly{\def\@IEEEauthorblockconfadjspace{0.75\@IEEEnormalsizeunitybaselineskip}} + +% spacing between name and affiliation blocks (confmode) +% This can be negative. +% The IEEE doesn't want any added spacing here, but I will leave these +% controls in place in case they ever change their mind. +% Personally, I like 0.75ex. +%\def\@IEEEauthorblockNtopspace{0.75ex} +%\def\@IEEEauthorblockAtopspace{0.75ex} +\def\@IEEEauthorblockNtopspace{0.0ex} +\def\@IEEEauthorblockAtopspace{0.0ex} +\ifCLASSOPTIONtransmag +% transmag uses one line of space above first affiliation block +\def\@IEEEauthorblockAtopspace{1\@IEEEnormalsizeunitybaselineskip} +\fi + +% baseline spacing within name and affiliation blocks (confmode) +% must be positive, spacings below certain values will make +% the position of line of text sensitive to the contents of the +% line above it i.e., whether or not the prior line has descenders, +% subscripts, etc. For this reason it is a good idea to keep +% these above 2.6ex +\def\@IEEEauthorblockNinterlinespace{2.6ex} +\def\@IEEEauthorblockAinterlinespace{2.75ex} + +% This tracks the required strut size. +% See the \@IEEEauthorhalign command for the actual default value used. +\def\@IEEEauthorblockXinterlinespace{2.7ex} + +% variables to retain font size and style across groups +% values given here have no effect as they will be overwritten later +\gdef\@IEEESAVESTATEfontsize{10} +\gdef\@IEEESAVESTATEfontbaselineskip{12} +\gdef\@IEEESAVESTATEfontencoding{OT1} +\gdef\@IEEESAVESTATEfontfamily{ptm} +\gdef\@IEEESAVESTATEfontseries{m} +\gdef\@IEEESAVESTATEfontshape{n} + +% saves the current font attributes +\def\@IEEEcurfontSAVE{\global\let\@IEEESAVESTATEfontsize\f@size% +\global\let\@IEEESAVESTATEfontbaselineskip\f@baselineskip% +\global\let\@IEEESAVESTATEfontencoding\f@encoding% +\global\let\@IEEESAVESTATEfontfamily\f@family% +\global\let\@IEEESAVESTATEfontseries\f@series% +\global\let\@IEEESAVESTATEfontshape\f@shape} + +% restores the saved font attributes +\def\@IEEEcurfontRESTORE{\fontsize{\@IEEESAVESTATEfontsize}{\@IEEESAVESTATEfontbaselineskip}% +\fontencoding{\@IEEESAVESTATEfontencoding}% +\fontfamily{\@IEEESAVESTATEfontfamily}% +\fontseries{\@IEEESAVESTATEfontseries}% +\fontshape{\@IEEESAVESTATEfontshape}% +\selectfont} + + +% variable to indicate if the current block is the first block in the column +\newif\if@IEEEprevauthorblockincol \@IEEEprevauthorblockincolfalse + + +% the command places a strut with height and depth = \@IEEEauthorblockXinterlinespace +% we use this technique to have complete manual control over the spacing of the lines +% within the halign environment. +% We set the below baseline portion at 30%, the above +% baseline portion at 70% of the total length. +% Responds to changes in the document's \baselinestretch +\def\@IEEEauthorstrutrule{\@IEEEtrantmpdimenA\@IEEEauthorblockXinterlinespace% +\@IEEEtrantmpdimenA=\baselinestretch\@IEEEtrantmpdimenA% +\rule[-0.3\@IEEEtrantmpdimenA]{0pt}{\@IEEEtrantmpdimenA}} + + +% blocks to hold the authors' names and affilations. +% Makes formatting easy for conferences +% +% use real definitions in conference mode +% name block +\def\IEEEauthorblockN#1{\relax\@IEEEauthorblockNstyle% set the default text style +\gdef\@IEEEauthorblockXinterlinespace{0pt}% disable strut for spacer row +% the \expandafter hides the \cr in conditional tex, see the array.sty docs +% for details, probably not needed here as the \cr is in a macro +% do a spacer row if needed +\if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockNtopspaceline\fi +\global\@IEEEprevauthorblockincoltrue% we now have a block in this column +%restore the correct strut value +\gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockNinterlinespace}% +% input the author names +#1% +% end the row if the user did not already +\crcr} +% spacer row for names +\def\@IEEEauthorblockNtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockNtopspace}} +% +% affiliation block +\def\IEEEauthorblockA#1{\relax\@IEEEauthorblockAstyle% set the default text style +\gdef\@IEEEauthorblockXinterlinespace{0pt}%disable strut for spacer row +% the \expandafter hides the \cr in conditional tex, see the array.sty docs +% for details, probably not needed here as the \cr is in a macro +% do a spacer row if needed +\if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockAtopspaceline\fi +\global\@IEEEprevauthorblockincoltrue% we now have a block in this column +%restore the correct strut value +\gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockAinterlinespace}% +% input the author affiliations +#1% +% end the row if the user did not already +\crcr +% V1.8 transmag does not use any additional affiliation spacing after the first author +\ifCLASSOPTIONtransmag\gdef\@IEEEauthorblockAtopspace{0pt}\fi} + +% spacer row for affiliations +\def\@IEEEauthorblockAtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockAtopspace}} + + +% allow papers to compile even if author blocks are used in modes other +% than conference or peerreviewca. For such cases, we provide dummy blocks. +\ifCLASSOPTIONconference +\else + \ifCLASSOPTIONpeerreviewca\else + % not conference, peerreviewca or transmag mode + \ifCLASSOPTIONtransmag\else + \def\IEEEauthorblockN#1{#1}% + \def\IEEEauthorblockA#1{#1}% + \fi + \fi +\fi + + + +% we provide our own halign so as not to have to depend on tabular +\def\@IEEEauthorhalign{\@IEEEauthordefaulttextstyle% default text style + \lineskip=0pt\relax% disable line spacing + \lineskiplimit=0pt\relax% + \baselineskip=0pt\relax% + \@IEEEcurfontSAVE% save the current font + \mathsurround\z@\relax% no extra spacing around math + \let\\\@IEEEauthorhaligncr% replace newline with halign friendly one + \tabskip=0pt\relax% no column spacing + \everycr{}% ensure no problems here + \@IEEEprevauthorblockincolfalse% no author blocks yet + \def\@IEEEauthorblockXinterlinespace{2.7ex}% default interline space + \vtop\bgroup%vtop box + \halign\bgroup&\relax\hfil\@IEEEcurfontRESTORE\relax ##\relax + \hfil\@IEEEcurfontSAVE\@IEEEauthorstrutrule\cr} + +% ensure last line, exit from halign, close vbox +\def\end@IEEEauthorhalign{\crcr\egroup\egroup} + +% handle bogus star form +\def\@IEEEauthorhaligncr{{\ifnum0=`}\fi\@ifstar{\@@IEEEauthorhaligncr}{\@@IEEEauthorhaligncr}} + +% test and setup the optional argument to \\[] +\def\@@IEEEauthorhaligncr{\@testopt\@@@IEEEauthorhaligncr\z@skip} + +% end the line and do the optional spacer +\def\@@@IEEEauthorhaligncr[#1]{\ifnum0=`{\fi}\cr\noalign{\vskip#1\relax}} + + + +% flag to prevent multiple \and warning messages +\newif\if@IEEEWARNand +\@IEEEWARNandtrue + +% if in conference or peerreviewca modes, we support the use of \and as \author is a +% tabular environment, otherwise we warn the user that \and is invalid +% outside of conference or peerreviewca modes. +\def\and{\relax} % provide a bogus \and that we will then override + +\renewcommand{\and}[1][\relax]{\if@IEEEWARNand\typeout{** WARNING: \noexpand\and is valid only + when in conference or peerreviewca}\typeout{modes (line \the\inputlineno).}\fi\global\@IEEEWARNandfalse} + +\ifCLASSOPTIONconference% +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi +\ifCLASSOPTIONpeerreviewca +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi +% V1.8 transmag uses conference author format +\ifCLASSOPTIONtransmag +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi + +% page clearing command +% based on LaTeX2e's \cleardoublepage, but allows different page styles +% for the inserted blank pages +\def\@IEEEcleardoublepage#1{\clearpage\if@twoside\ifodd\c@page\else +\hbox{}\thispagestyle{#1}\newpage\if@twocolumn\hbox{}\thispagestyle{#1}\newpage\fi\fi\fi} + +% V1.8b hooks to allow adjustment of space above title +\def\IEEEtitletopspace{0.5\baselineskip} +% an added extra amount to allow for adjustment/offset +\def\IEEEtitletopspaceextra{0pt} + +% user command to invoke the title page +\def\maketitle{\par% + \begingroup% + \normalfont% + \def\thefootnote{}% the \thanks{} mark type is empty + \def\footnotemark{}% and kill space from \thanks within author + \let\@makefnmark\relax% V1.7, must *really* kill footnotemark to remove all \textsuperscript spacing as well. + \footnotesize% equal spacing between thanks lines + \footnotesep 0.7\baselineskip%see global setting of \footnotesep for more info + % V1.7 disable \thanks note indention for compsoc + \@IEEEcompsoconly{\long\def\@makefntext##1{\parindent 1em\noindent\hbox{\@makefnmark}##1}}% + \normalsize% + \ifCLASSOPTIONpeerreview + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \thispagestyle{IEEEpeerreviewcoverpagestyle}\@thanks% + \else + \if@twocolumn% + \ifCLASSOPTIONtechnote% + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \else + \twocolumn[{\IEEEquantizevspace{\@maketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}\@IEEEaftertitletext}]% + \fi + \else + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \fi + \thispagestyle{IEEEtitlepagestyle}\@thanks% + \fi + % pullup page for pubid if used. + \if@IEEEusingpubid + \enlargethispage{-\@IEEEpubidpullup}% + \fi + \endgroup + \setcounter{footnote}{0}\let\maketitle\relax\let\@maketitle\relax + \gdef\@thanks{}% + % v1.6b do not clear these as we will need the title again for peer review papers + % \gdef\@author{}\gdef\@title{}% + \let\thanks\relax} + + +% V1.8 parbox to format \@IEEEtitleabstractindextext +\long\def\@IEEEtitleabstractindextextbox#1{\parbox{1\textwidth}{#1}} +% V1.8 compsoc is partial width +\ifCLASSOPTIONcompsoc +% comparison with proofs suggests it's in the range of 92.1-92.3% +\long\def\@IEEEtitleabstractindextextbox#1{\parbox{0.922\textwidth}{\@IEEEcompsocnotconfonly{\rightskip\@flushglue\leftskip\z@skip}#1}} +\fi + +% formats the Title, authors names, affiliations and special paper notice +% THIS IS A CONTROLLED SPACING COMMAND! Do not allow blank lines or unintentional +% spaces to enter the definition - use % at the end of each line +\def\@maketitle{\newpage +\bgroup\par\vskip\IEEEtitletopspace\vskip\IEEEtitletopspaceextra\centering% +\ifCLASSOPTIONtechnote% technotes, V1.8a abstract and index terms are not treated differently for compsoc technotes + {\bfseries\large\@IEEEcompsoconly{\Large\sffamily}\@title\par}\vskip 1.3em{\lineskip .5em\@IEEEcompsoconly{\large\sffamily}\@author + \@IEEEspecialpapernotice\par}\relax +\else% not a technote + \vskip0.2em{\Huge\ifCLASSOPTIONtransmag\bfseries\LARGE\fi\@IEEEcompsoconly{\sffamily}\@IEEEcompsocconfonly{\normalfont\normalsize\vskip 2\@IEEEnormalsizeunitybaselineskip + \bfseries\Large}\@IEEEcompsocnotconfonly{\vskip 0.75\@IEEEnormalsizeunitybaselineskip}\@title\par}\relax + \@IEEEcompsocnotconfonly{\vskip 0.5\@IEEEnormalsizeunitybaselineskip}\vskip1.0em\par% + % V1.6 handle \author differently if in conference mode + \ifCLASSOPTIONconference% + {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par}\relax + \else% peerreviewca, peerreview or journal + \ifCLASSOPTIONpeerreviewca + % peerreviewca handles author names just like conference mode + {\@IEEEcompsoconly{\sffamily}\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par + {\@IEEEcompsoconly{\vskip 1.5em\relax + \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill + \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax + \else% journal, peerreview or transmag + \ifCLASSOPTIONtransmag + % transmag also handles author names just like conference mode + % it also uses \@IEEEtitleabstractindextex, but with one line less + % space above, and one more below + {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par + {\vspace{0.5\baselineskip}\relax\@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\vspace{-1\baselineskip}\par}}\relax + \else% journal or peerreview + {\lineskip.5em\@IEEEcompsoconly{\sffamily}\sublargesize\@author\@IEEEspecialpapernotice\par + {\@IEEEcompsoconly{\vskip 1.5em\relax + \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill + \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax + \fi + \fi + \fi +\fi\par\addvspace{0.5\baselineskip}\egroup} + + +% V1.7 Computer Society "diamond line" which follows index terms for nonconference papers +% V1.8a full width diamond line for single column use +\def\@IEEEcompsocdiamondlinei{\vrule depth 0pt height 0.5pt width 4cm\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 4cm\relax} +% V1.8a narrower width diamond line for double column use +\def\@IEEEcompsocdiamondlineii{\vrule depth 0pt height 0.5pt width 2.5cm\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 2.5cm\relax} +% V1.8a bare core without rules to base a last resort on for very narrow linewidths +\def\@IEEEcompsocdiamondlineiii{\mbox{}\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\mbox{}\relax} + +% V1.8a allow \IEEEcompsocdiamondline to adjust for different linewidths. +% Use \@IEEEcompsocdiamondlinei if its width is less than 0.66\linewidth (0.487 nominal for single column) +% if not, fall back to \@IEEEcompsocdiamondlineii if its width is less than 0.75\linewidth (0.659 nominal for double column) +% if all else fails, try to make a custom diamondline based on the abnormally narrow linewidth +\def\IEEEcompsocdiamondline{\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlinei}\relax +\ifdim\@IEEEtrantmpdimenA<0.66\linewidth\relax\@IEEEcompsocdiamondlinei\relax +\else +\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineii}\relax +\ifdim\@IEEEtrantmpdimenA<0.75\linewidth\relax\@IEEEcompsocdiamondlineii\relax +\else +\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineiii}\relax +\@IEEEtrantmpdimenB=\linewidth\relax +\addtolength{\@IEEEtrantmpdimenB}{-1\@IEEEtrantmpdimenA}\relax +\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\@IEEEcompsocdiamondlineiii\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\relax +\fi\fi} + + +% V1.7 standard LateX2e \thanks, but with \itshape under compsoc. Also make it a \long\def +% We also need to trigger the one-shot footnote rule +\def\@IEEEtriggeroneshotfootnoterule{\global\@IEEEenableoneshotfootnoteruletrue} + + +\long\def\thanks#1{\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{\@IEEEcompsoconly{\itshape + \protect\@IEEEtriggeroneshotfootnoterule\relax}\ignorespaces#1}}} +\let\@thanks\@empty + + +% V1.7 allow \author to contain \par's. This is needed to allow \thanks to contain \par. +\long\def\author#1{\gdef\@author{#1}} + + +% in addition to setting up IEEEitemize, we need to remove a baselineskip space above and +% below it because \list's \pars introduce blank lines because of the footnote struts. +\def\@IEEEsetupcompsocitemizelist{\def\labelitemi{$\bullet$}% +\setlength{\IEEElabelindent}{0pt}\setlength{\labelsep}{1.2em}\setlength{\parskip}{0pt}% +\setlength{\partopsep}{0pt}\setlength{\topsep}{0.5\baselineskip}\vspace{-1\baselineskip}\relax} + + +% flag for fake non-compsoc \IEEEcompsocthanksitem - prevents line break on very first item +\newif\if@IEEEbreakcompsocthanksitem \@IEEEbreakcompsocthanksitemfalse + +\ifCLASSOPTIONcompsoc +% V1.7 compsoc bullet item \thanks +% also, we need to redefine this to destroy the argument in \IEEEquantizevspace +\long\def\IEEEcompsocitemizethanks#1{\relax\@IEEEbreakcompsocthanksitemfalse\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{\itshape\protect\@IEEEtriggeroneshotfootnoterule + {\let\IEEEiedlistdecl\relax\protect\begin{IEEEitemize}[\protect\@IEEEsetupcompsocitemizelist]\ignorespaces#1\relax + \protect\end{IEEEitemize}}\protect\vspace{-1\baselineskip}}}} +\DeclareRobustCommand*{\IEEEcompsocthanksitem}{\item} +\else +% non-compsoc, allow for dual compilation via rerouting to normal \thanks +\long\def\IEEEcompsocitemizethanks#1{\thanks{#1}} +% redirect to "pseudo-par" \hfil\break\indent after swallowing [] from \IEEEcompsocthanksitem[] +\DeclareRobustCommand{\IEEEcompsocthanksitem}{\@ifnextchar [{\@IEEEthanksswallowoptionalarg}% +{\@IEEEthanksswallowoptionalarg[\relax]}} +% be sure and break only after first item, be sure and ignore spaces after optional argument +\def\@IEEEthanksswallowoptionalarg[#1]{\relax\if@IEEEbreakcompsocthanksitem\hfil\break +\indent\fi\@IEEEbreakcompsocthanksitemtrue\ignorespaces} +\fi + + +% V1.6b define the \IEEEpeerreviewmaketitle as needed +\ifCLASSOPTIONpeerreview +\def\IEEEpeerreviewmaketitle{\@IEEEcleardoublepage{empty}% +\ifCLASSOPTIONtwocolumn +\twocolumn[{\IEEEquantizevspace{\@IEEEpeerreviewmaketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}}] +\else +\newpage\@IEEEpeerreviewmaketitle\@IEEEstatictitlevskip +\fi +\thispagestyle{IEEEtitlepagestyle}} +\else +% \IEEEpeerreviewmaketitle does nothing if peer review option has not been selected +\def\IEEEpeerreviewmaketitle{\relax} +\fi + +% peerreview formats the repeated title like the title in journal papers. +\def\@IEEEpeerreviewmaketitle{\bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEcompsoconly{\sffamily}% +\normalfont\normalsize\vskip0.2em{\Huge\@title\par}\vskip1.0em\par +\par\addvspace{0.5\baselineskip}\egroup} + + + +% V1.6 +% this is a static rubber spacer between the title/authors and the main text +% used for single column text, or when the title appears in the first column +% of two column text (technotes). +\def\@IEEEstatictitlevskip{{\normalfont\normalsize +% adjust spacing to next text +% v1.6b handle peer review papers +\ifCLASSOPTIONpeerreview +% for peer review papers, the same value is used for both title pages +% regardless of the other paper modes + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip +\else + \ifCLASSOPTIONconference% conference + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip% + \else% + \ifCLASSOPTIONtechnote% technote + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip% + \else% journal uses more space + \vskip 2.5\baselineskip plus 0.75\baselineskip minus 0.375\baselineskip% + \fi + \fi +\fi}} + + +% set the nominal and minimum values for the quantized title spacer +% the quantization algorithm will not allow the spacer size to +% become less than \@IEEEMINtitlevspace - instead it will be lengthened +% default to journal values +\def\@IEEENORMtitlevspace{2.5\baselineskip} +\def\@IEEEMINtitlevspace{2\baselineskip} +% conferences and technotes need tighter spacing +\ifCLASSOPTIONconference% conference + \def\@IEEENORMtitlevspace{1\baselineskip} + \def\@IEEEMINtitlevspace{0.75\baselineskip} +\fi +\ifCLASSOPTIONtechnote% technote + \def\@IEEENORMtitlevspace{1\baselineskip} + \def\@IEEEMINtitlevspace{0.75\baselineskip} +\fi + + +% V1.8a +\def\IEEEquantizevspace{\begingroup\@ifstar{\@IEEEquantizevspacestarformtrue\@IEEEquantizevspace}{\@IEEEquantizevspacestarformfalse\@IEEEquantizevspace}} +% \IEEEquantizevspace[output dimen register]{object}[object decl] +% {top baselineskip} +% [offset][prevdepth][lineskip limit][lineskip] +% {unit height}{nominal vspace}{minimum vspace} +% +% Calculates and creates the vspace needed to make the combined height with +% the given object an integer multiple of the given unit height. This command +% is more general than the older \@IEEEdynamictitlevspace it replaces. +% +% The star form has no effect at present, but is reserved for future use. +% +% If the optional argument [output dimen register] is given, the calculated +% vspace height is stored in the given output dimen (or skip) register +% and no other action is taken, otherwise the object followed by a vspace* +% of the appropriate height is evaluated/output. +% +% The optional object decl (declarations) is code that is evaluated just +% before the object's height is evaluated. Its intented purpose is to allow +% for the alteration or disabling of code within the object during internal +% height evaluation (e.g., \long\def\thanks#1{\relax} ). +% This special code is not invoked if/when the object is rendered at the end. +% +% The nominal vspace is the target value of the added vspace and the minimum +% vspace is the lower allowed limit. The vspacer will be the value that achieves +% integral overall height, in terms of the given unit height, that is closest +% to the nominal vspace and that is not less than the specified minimum vspace. +% +% The line spacing algorithm of TeX is somewhat involved and requires special +% care with regard to the first line of a vertical list (which is indicated +% when \prevdepth is -1000pt or less). top baselineskip specifies the +% baselineskip or topskip used prior to the object. If the height of the +% first line of the object is greater than the given top baselineskip, then +% the top baselineskip is subtracted from the height of the first line and +% that difference is considered along with the rest of the object height +% (because the object will be shifted down by an amount = +% top line height - top baselineskip). Otherwise, the height of the first line +% of the object is ignored as far as the calculations are concerned. +% This algorithm is adequate for objects that appear at the top of a page +% (e.g., titles) where \topskip spacing is used. +% +% However, as explained on page 78 of the TeXbook, interline spacing is more +% complex when \baselineskip is being used (indicated by \prevdepth > +% -1000pt). The four optional parameters offset, prevdepth, lineskip limit and +% lineskip are assumed to be equal to be 0pt, \prevdepth, \lineskiplimit and +% \lineskip, respectively, if they are omitted. +% +% The prevdepth is the depth of the line before the object, the lineskip limit +% specifies how close the top of the object can come to the bottom of the +% previous line before \baselineskip is ignored and \lineskip is inserted +% between the object and the line above it. Lineskip does not come into +% play unless the first line of the object is high enough to "get too close" +% (as specified by lineskiplimit) to the line before it. The the prevdepth, +% lineskip limit, and lineskip optional parameters are not needed for the +% first object/line on a page (i.e., prevdepth <= -1000pt) where the simplier +% \topskip spacing rules are in effect. +% +% Offset is a manual adjustment that is added to the height calculations of +% object irrespective of the value of \prevdepth. It is useful when the top +% baselineskip will result in a noninteger unit height object placement even +% if the object itself has integral height. e.g., a footnotesize baselineskip +% is used before the object, thus an offset of, say -3pt, can be given as a +% correction. + +% Common combinations of these parameters include: +% +% top baselineskip: (and default values for offset, prevdepth, etc.) +% \topskip % for objects that appear at the top of a page +% \maxdimen % always ignore the height of the top line +% 0pt % always consider any positive height of the top line +% +% for objects to appear inline in normal text: +% top baselineskip = \baselineskip +% +% set prevdepth = -1000pt and top baselineskip = 0pt to consider the +% overall height of the object without any other external skip +% consideration + +\newif\if@IEEEquantizevspacestarform % flag to indicate star form +\newif\if@IEEEquantizevspaceuseoutdimenreg % flag to indicate output dimen register is to be used +% Use our own private registers because the object could contain a +% structure that uses the existing tmp scratch pad registers +\newdimen\@IEEEquantizeheightA +\newdimen\@IEEEquantizeheightB +\newdimen\@IEEEquantizeheightC +\newdimen\@IEEEquantizeprevdepth % need to save this early as can change +\newcount\@IEEEquantizemultiple +\newbox\@IEEEquantizeboxA + + +\def\@IEEEquantizevspace{\@ifnextchar [{\@IEEEquantizevspaceuseoutdimenregtrue\@@IEEEquantizevspace}{\@IEEEquantizevspaceuseoutdimenregfalse\@@IEEEquantizevspace[]}} + + +\long\def\@@IEEEquantizevspace[#1]#2{\relax +% acquire and store +% #1 optional output dimen register +% #2 object +\edef\@IEEEquantizeoutdimenreg{#1}\relax +% allow for object specifications that contain parameters +\@IEEEtrantmptoksA={#2}\relax +\long\edef\@IEEEquantizeobject{\the\@IEEEtrantmptoksA}\relax +\@ifnextchar [{\@@@IEEEquantizevspace}{\@@@IEEEquantizevspace[\relax]}} + +\long\def\@@@IEEEquantizevspace[#1]#2{\relax +% acquire and store +% [#1] optional object decl, is \relax if not given by user +% #2 top baselineskip +% allow for object decl specifications that have parameters +\@IEEEtrantmptoksA={#1}\relax +\long\edef\@IEEEquantizeobjectdecl{\the\@IEEEtrantmptoksA}\relax +\edef\@IEEEquantizetopbaselineskip{#2}\ivIEEEquantizevspace} + +% acquire optional argument set and store +% [offset][prevdepth][lineskip limit][lineskip] +\def\ivIEEEquantizevspace{\@ifnextchar [{\@vIEEEquantizevspace}{\@vIEEEquantizevspace[0pt]}} +\def\@vIEEEquantizevspace[#1]{\edef\@IEEEquantizeoffset{#1}\@ifnextchar [{\@viIEEEquantizevspace}{\@viIEEEquantizevspace[\prevdepth]}} +\def\@viIEEEquantizevspace[#1]{\@IEEEquantizeprevdepth=#1\relax\@ifnextchar [{\@viiIEEEquantizevspace}{\@viiIEEEquantizevspace[\lineskiplimit]}} +\def\@viiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskiplimit{#1}\@ifnextchar [{\@viiiIEEEquantizevspace}{\@viiiIEEEquantizevspace[\lineskip]}} +\def\@viiiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskip{#1}\@ixIEEEquantizevspace} + +% main routine +\def\@ixIEEEquantizevspace#1#2#3{\relax +\edef\@IEEEquantizeunitheight{#1}\relax +\edef\@IEEEquantizenomvspace{#2}\relax +\edef\@IEEEquantizeminvspace{#3}\relax +% \@IEEEquantizeoutdimenreg +% \@IEEEquantizeobject +% \@IEEEquantizeobjectdecl +% \@IEEEquantizetopbaselineskip +% \@IEEEquantizeoffset +% \@IEEEquantizeprevdepth +% \@IEEEquantizelineskiplimit +% \@IEEEquantizelineskip +% \@IEEEquantizeunitheight +% \@IEEEquantizenomvspace +% \@IEEEquantizeminvspace +% get overall height of object +\setbox\@IEEEquantizeboxA\vbox{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax +\@IEEEquantizeheightA\ht\@IEEEquantizeboxA\relax +% get height of first line of object +\setbox\@IEEEquantizeboxA\vtop{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax +\@IEEEquantizeheightB\ht\@IEEEquantizeboxA\relax +\ifdim\@IEEEquantizeprevdepth>-1000pt\relax % prevdepth > -1000pf means full baselineskip\lineskip rules in effect +% lineskip spacing rule takes effect if height of top line > baselineskip - prevdepth - lineskiplimit, +% otherwise the baselineskip rule is in effect and the height of the first line does not matter at all. +\@IEEEquantizeheightC=\@IEEEquantizetopbaselineskip\relax +\advance\@IEEEquantizeheightC-\@IEEEquantizeprevdepth\relax +\advance\@IEEEquantizeheightC-\@IEEEquantizelineskiplimit\relax % this works even though \@IEEEquantizelineskiplimit is a macro because TeX allows --10pt notation +\ifdim\@IEEEquantizeheightB>\@IEEEquantizeheightC\relax +% lineskip spacing rule is in effect i.e., the object is going to be shifted down relative to the +% baselineskip set position by its top line height (already a part of the total height) + prevdepth + lineskip - baselineskip +\advance\@IEEEquantizeheightA\@IEEEquantizeprevdepth\relax +\advance\@IEEEquantizeheightA\@IEEEquantizelineskip\relax +\advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax +\else +% height of first line <= \@IEEEquantizetopbaselineskip - \@IEEEquantizeprevdepth - \@IEEEquantizelineskiplimit +% standard baselineskip rules are in effect, so don't consider height of first line +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax +\fi +% +\else % prevdepth <= -1000pt, simplier \topskip type rules in effect +\ifdim\@IEEEquantizeheightB>\@IEEEquantizetopbaselineskip +% height of top line (already included in the total height) in excess of +% baselineskip is the amount it will be downshifted +\advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax +\else +% height of first line is irrelevant, remove it +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax +\fi +\fi % prevdepth <= -1000pt +% +% adjust height for any manual offset +\advance\@IEEEquantizeheightA\@IEEEquantizeoffset\relax +% add in nominal spacer +\advance\@IEEEquantizeheightA\@IEEEquantizenomvspace\relax +% check for nonzero unitheight +\@IEEEquantizeheightB=\@IEEEquantizeunitheight\relax +\ifnum\@IEEEquantizeheightB=0\relax +\@IEEEclspkgerror{IEEEquantizevspace unit height cannot be zero. Assuming 10pt.}% +{Division by zero is not allowed.} +\@IEEEquantizeheightB=10pt\relax +\fi +% get integer number of lines +\@IEEEquantizemultiple=\@IEEEquantizeheightA\relax +\divide\@IEEEquantizemultiple\@IEEEquantizeheightB\relax +% set A to contain the excess height over the \@IEEEquantizemultiple of lines +% A = height - multiple*unitheight +\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\multiply\@IEEEquantizeheightC\@IEEEquantizemultiple\relax +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightC\relax +% set B to contain the height short of \@IEEEquantizemultiple+1 of lines +% B = unitheight - A +\advance\@IEEEquantizeheightB-\@IEEEquantizeheightA\relax +% choose A or B based on which is closer +\@IEEEquantizeheightC\@IEEEquantizenomvspace\relax +\ifdim\@IEEEquantizeheightA<\@IEEEquantizeheightB\relax +% C = nomvspace - A, go with lower +\advance\@IEEEquantizeheightC-\@IEEEquantizeheightA\relax +\else +% C = nomvspace + B, go with upper +\advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\fi +% if violate lower bound, use next integer bound +\ifdim\@IEEEquantizeheightC<\@IEEEquantizeminvspace\relax +% A + B = unitheight +\advance\@IEEEquantizeheightC\@IEEEquantizeheightA\relax +\advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\fi +% export object and spacer outside of group +\global\let\@IEEEquantizeobjectout\@IEEEquantizeobject\relax +\global\@IEEEquantizeheightC\@IEEEquantizeheightC\relax +\endgroup +\if@IEEEquantizevspaceuseoutdimenreg +\@IEEEquantizeoutdimenreg=\@IEEEquantizeheightC\relax +\else +\@IEEEquantizeobjectout\relax +\vskip\@IEEEquantizeheightC\relax +\fi} + + +% user command to disable all global assignments, possible use within object decl +\def\IEEEquantizedisableglobal{\let\global\relax +\let\gdef\def +\let\xdef\edef} +% user command to allow for the disabling of \thanks and other commands, possible use within object decl +\def\IEEEquantizedisabletitlecmds{\long\def\thanks##1{\relax}\relax +\long\def\IEEEcompsocitemizethanks##1{\relax}\def\newpage{\relax}} + + + + + +% V1.6 +% we allow the user access to the last part of the title area +% useful in emergencies such as when a different spacing is needed +% This text is NOT compensated for in the dynamic sizer. +\let\@IEEEaftertitletext=\relax +\long\def\IEEEaftertitletext#1{\def\@IEEEaftertitletext{#1}} + + +% V1.7 provide a way for users to enter abstract and keywords +% into the onecolumn title are. This text is compensated for +% in the dynamic sizer. +\let\@IEEEtitleabstractindextext=\relax +\long\def\IEEEtitleabstractindextext#1{\def\@IEEEtitleabstractindextext{#1}} + +% V1.7 provide a way for users to get the \@IEEEtitleabstractindextext if +% not in compsoc or transmag journal mode - this way abstract and keywords +% can still be placed in their conventional position if not in those modes. +\def\IEEEdisplaynontitleabstractindextext{% +% display for all conference formats +\ifCLASSOPTIONconference\@IEEEtitleabstractindextext\relax +\else% non-conferences + % V1.8a display for all technotes + \ifCLASSOPTIONtechnote\@IEEEtitleabstractindextext\relax + % V1.8a add diamond line after abstract and index terms for compsoc technotes + \@IEEEcompsoconly{\noindent\hfill\IEEEcompsocdiamondline\hfill\hbox{}\par}\relax + \else % non-conferences and non-technotes + \ifCLASSOPTIONcompsoc% display if not compsoc and not transmag + \else + \ifCLASSOPTIONtransmag + \else% not compsoc journal nor transmag journal + \@IEEEtitleabstractindextext\relax + \fi + \fi + \fi +\fi} + + +% command to allow alteration of baselinestretch, but only if the current +% baselineskip is unity. Used to tweak the compsoc abstract and keywords line spacing. +\def\@IEEEtweakunitybaselinestretch#1{{\def\baselinestretch{1}\selectfont +\global\@tempskipa\baselineskip}\ifnum\@tempskipa=\baselineskip% +\def\baselinestretch{#1}\selectfont\fi\relax} + + +% abstract and keywords are in \small, except +% for 9pt docs in which they are in \footnotesize +% Because 9pt docs use an 8pt footnotesize, \small +% becomes a rather awkward 8.5pt +\def\@IEEEabskeysecsize{\small} +\ifx\CLASSOPTIONpt\@IEEEptsizenine + \def\@IEEEabskeysecsize{\footnotesize} +\fi + +% compsoc journals use \footnotesize, compsoc conferences use normalsize +\@IEEEcompsoconly{\def\@IEEEabskeysecsize{\footnotesize}} +\@IEEEcompsocconfonly{\def\@IEEEabskeysecsize{\small}} + + +% V1.6 have abstract and keywords strip leading spaces, pars and newlines +% so that spacing is more tightly controlled. +\def\abstract{\normalfont + \if@twocolumn + \@IEEEabskeysecsize\bfseries\textit{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +% V1.6 The IEEE wants only 1 pica from end of abstract to introduction heading when in +% conference mode (the heading already has this much above it) +\def\endabstract{\relax\ifCLASSOPTIONconference\vspace{0ex}\else\vspace{1.34ex}\fi\par\if@twocolumn\else\endquotation\fi + \normalfont\normalsize} + +\def\IEEEkeywords{\normalfont + \if@twocolumn + \@IEEEabskeysecsize\bfseries\textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +\def\endIEEEkeywords{\relax\ifCLASSOPTIONtechnote\vspace{1.34ex}\else\vspace{0.67ex}\fi + \par\if@twocolumn\else\endquotation\fi% + \normalfont\normalsize} + +% V1.7 compsoc keywords index terms +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONconference% compsoc conference +\def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries + \if@twocolumn + \@IEEEabskeysecsize\noindent\textit{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} +\def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries + \if@twocolumn + \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent + \textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} + \else% compsoc not conference +\def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily + \if@twocolumn + \@IEEEabskeysecsize\noindent\textbf{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} +\def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily + \if@twocolumn + \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent + \textbf{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} + \fi +\fi + +% V1.8 transmag keywords index terms +% no abstract name, use indentation +\ifCLASSOPTIONtransmag +\def\abstract{\normalfont\parindent 1em\relax + \if@twocolumn + \@IEEEabskeysecsize\bfseries\indent + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize + \textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} + +\def\IEEEkeywords{\normalfont\parindent 1em\relax + \if@twocolumn + \@IEEEabskeysecsize\vspace{1\baselineskip}\bfseries\indent\textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\vspace{1\baselineskip}\centering\@IEEEabskeysecsize + \textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +\fi + + + +% gobbles all leading \, \\ and \par, upon finding first token that +% is not a \ , \\ or a \par, it ceases and returns that token +% +% used to strip leading \, \\ and \par from the input +% so that such things in the beginning of an environment will not +% affect the formatting of the text +\long\def\@IEEEgobbleleadPARNLSP#1{\let\@IEEEswallowthistoken=0% +\let\@IEEEgobbleleadPARNLSPtoken#1% +\let\@IEEEgobbleleadPARtoken=\par% +\let\@IEEEgobbleleadNLtoken=\\% +\let\@IEEEgobbleleadSPtoken=\ % +\def\@IEEEgobbleleadSPMACRO{\ }% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadPARtoken% +\let\@IEEEswallowthistoken=1% +\fi% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadNLtoken% +\let\@IEEEswallowthistoken=1% +\fi% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPtoken% +\let\@IEEEswallowthistoken=1% +\fi% +% a control space will come in as a macro +% when it is the last one on a line +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPMACRO% +\let\@IEEEswallowthistoken=1% +\fi% +% if we have to swallow this token, do so and taste the next one +% else spit it out and stop gobbling +\ifx\@IEEEswallowthistoken 1\let\@IEEEnextgobbleleadPARNLSP=\@IEEEgobbleleadPARNLSP\else% +\let\@IEEEnextgobbleleadPARNLSP=#1\fi% +\@IEEEnextgobbleleadPARNLSP}% + + + + +% TITLING OF SECTIONS +\def\@IEEEsectpunct{:\ \,} % Punctuation after run-in section heading (headings which are + % part of the paragraphs), need little bit more than a single space + % spacing from section number to title +% compsoc conferences use regular period/space punctuation +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference +\def\@IEEEsectpunct{.\ } +\fi\fi + + +\def\@seccntformat#1{\csname the#1dis\endcsname\hskip 0.5em\relax} + +\ifCLASSOPTIONcompsoc +% compsoc journals need extra spacing +\ifCLASSOPTIONconference\else +\def\@seccntformat#1{\csname the#1dis\endcsname\hskip 1em\relax} +\fi\fi + +%v1.7 put {} after #6 to allow for some types of user font control +%and use \@@par rather than \par +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + % load section label and spacer into \@svsec + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi% + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@% tempskipa determines whether is treated as a high + \begingroup #6{\relax% or low level heading + \noindent % subsections are NOT indented + % print top level headings. \@svsec is label, #8 is heading title + % The IEEE does not block indent the section title text, it flows like normal + {\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\@@par}}% + \endgroup + \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else + \protect\numberline{\csname the#1\endcsname}\fi#7}% + \else % printout low level headings + % svsechd seems to swallow the trailing space, protect it with \mbox{} + % got rid of sectionmark stuff + \def\@svsechd{#6{\hskip #3\relax\@svsec #8\@IEEEsectpunct\mbox{}}% + \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else + \protect\numberline{\csname the#1\endcsname}\fi#7}}% + \fi%skip down + \@xsect{#5}} + + +% section* handler +%v1.7 put {} after #4 to allow for some types of user font control +%and use \@@par rather than \par +\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + %\begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup + % The IEEE does not block indent the section title text, it flows like normal + \begingroup \noindent #4{\relax{\hskip #1}{\interlinepenalty \@M #5\@@par}}\endgroup + % svsechd swallows the trailing space, protect it with \mbox{} + \else \def\@svsechd{#4{\hskip #1\relax #5\@IEEEsectpunct\mbox{}}}\fi + \@xsect{#3}} + + +%% SECTION heading spacing and font +%% +% arguments are: #1 - sectiontype name +% (for \@sect) #2 - section level +% #3 - section heading indent +% #4 - top separation (absolute value used, neg indicates not to indent main text) +% If negative, make stretch parts negative too! +% #5 - (absolute value used) positive: bottom separation after heading, +% negative: amount to indent main text after heading +% Both #4 and #5 negative means to indent main text and use negative top separation +% #6 - font control +% You've got to have \normalfont\normalsize in the font specs below to prevent +% trouble when you do something like: +% \section{Note}{\ttfamily TT-TEXT} is known to ... +% The IEEE sometimes REALLY stretches the area before a section +% heading by up to about 0.5in. However, it may not be a good +% idea to let LaTeX have quite this much rubber. +\ifCLASSOPTIONconference% +% The IEEE wants section heading spacing to decrease for conference mode +\def\section{\@startsection{section}{1}{\z@}{1.5ex plus 1.5ex minus 0.5ex}% +{0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{1.5ex plus 1.5ex minus 0.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\else % for journals +\def\section{\@startsection{section}{1}{\z@}{3.0ex plus 1.5ex minus 1.5ex}% V1.6 3.0ex from 3.5ex +{0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{3.5ex plus 1.5ex minus 1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\fi + +% for both journals and conferences +% decided to put in a little rubber above the section, might help somebody +\def\subsubsection{\@startsection{subsubsection}{3}{\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize\itshape}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize\itshape}}% + + +% compsoc +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference +% compsoc conference +\def\section{\@startsection{section}{1}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\large\bfseries}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\sublargesize\bfseries}}% +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{0ex}{\normalfont\normalsize\bfseries}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize}}% +\else% compsoc journals +% use negative top separation as compsoc journals do not indent paragraphs after section titles +\def\section{\@startsection{section}{1}{\z@}{-3.5ex plus -2ex minus -1.5ex}% +{0.7ex plus 1ex minus 0ex}{\normalfont\sublargesize\sffamily\bfseries\scshape}}% +% Note that subsection and smaller may not be correct for the Computer Society, +% I have to look up an example. +\def\subsection{\@startsection{subsection}{2}{\z@}{-3.5ex plus -1.5ex minus -1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\sffamily\bfseries}}% +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex plus -1ex minus -1ex}% +{0.5ex plus 0.5ex minus 0ex}{\normalfont\normalsize\sffamily\itshape}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{-0ex plus -0.1ex minus -0.1ex}% +{0ex}{\normalfont\normalsize}}% +\fi\fi + +% transmag +\ifCLASSOPTIONtransmag +\def\subsection{\@startsection{subsection}{2}{0.75\parindent}{3.5ex plus 1.5ex minus 1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\def\subsubsection{\@startsection{subsubsection}{3}{1.25\parindent}{0.1ex plus 0.1ex minus 0.1ex}% +{0.1ex}{\normalfont\normalsize\itshape}}% +\fi + + +% V1.8a provide for a raised line Introduction section for use with Computer +% Society papers. We have to remove any spacing glue after the section +% heading and then remove the blank line for the new paragraph after it. +% LaTeX's section handler alters \everypar and we need to propogate those +% changes outside of the \parbox lest there be spacing problems at the top +% of the next section. +\def\IEEEraisesectionheading#1{\noindent\raisebox{1.5\baselineskip}[0pt][0pt]{\parbox[b]{\columnwidth}{#1\unskip\global\everypar=\everypar}}\vspace{-1\baselineskip}\vspace{-\parskip}\par} + + + +%% ENVIRONMENTS +% "box" symbols at end of proofs +\def\IEEEQEDclosed{\mbox{\rule[0pt]{1.3ex}{1.3ex}}} % for a filled box +% V1.6 some journals use an open box instead that will just fit around a closed one +\def\IEEEQEDopen{{\setlength{\fboxsep}{0pt}\setlength{\fboxrule}{0.2pt}\fbox{\rule[0pt]{0pt}{1.3ex}\rule[0pt]{1.3ex}{0pt}}}} +\ifCLASSOPTIONcompsoc +\def\IEEEQED{\IEEEQEDopen} % default to open for compsoc +\else +\def\IEEEQED{\IEEEQEDclosed} % otherwise default to closed +\fi + +%V1.8 flag to indicate if QED symbol is to be shown +\newif\if@IEEEQEDshow \@IEEEQEDshowtrue +\def\IEEEproofindentspace{2\parindent}% V1.8 allow user to change indentation amount if desired +% v1.7 name change to avoid namespace collision with amsthm. Also add support +% for an optional argument. +\def\IEEEproof{\@ifnextchar[{\@IEEEproof}{\@IEEEproof[\IEEEproofname]}} +\def\@IEEEproof[#1]{\@IEEEQEDshowtrue\par\noindent\hspace{\IEEEproofindentspace}{\itshape #1: }} +\def\endIEEEproof{\if@IEEEQEDshow\hspace*{\fill}\nobreakspace\IEEEQED\fi\par} +% qedhere for equation environments, similar to AMS \qedhere +\def\IEEEQEDhereeqn{\global\@IEEEQEDshowfalse\eqno\let\eqno\relax\let\leqno\relax + \let\veqno\relax\hbox{\IEEEQED}} +% IEEE style qedhere for IEEEeqnarray and other environments +\def\IEEEQEDhere{\global\@IEEEQEDshowfalse\IEEEQED} +% command to disable QED at end of IEEEproof +\def\IEEEQEDoff{\global\@IEEEQEDshowfalse} + + +%\itemindent is set to \z@ by list, so define new temporary variable +\newdimen\@IEEEtmpitemindent + +\ifCLASSOPTIONcompsoc +% V1.8a compsoc uses bold theorem titles, a period instead of a colon, vertical spacing, and hanging indentation +% V1.8 allow long theorem names to break across lines. +% Thanks to Miquel Payaro for reporting this. +\def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax + \topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip + \rmfamily\trivlist\hangindent\parindent% + \item[]\textit{\bfseries\noindent #1\ #2.} \itemindent\@IEEEtmpitemindent\relax} +\def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax +\topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip +\rmfamily\trivlist\hangindent\parindent% +% V1.6 The IEEE is back to using () around theorem names which are also in italics +% Thanks to Christian Peel for reporting this. + \item[]\textit{\bfseries\noindent #1\ #2\ (#3).} \itemindent\@IEEEtmpitemindent\relax} +% V1.7 remove bogus \unskip that caused equations in theorems to collide with +% lines below. +\def\@endtheorem{\endtrivlist\vskip 0.25\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip} +\else +% +% noncompsoc +% +% V1.8 allow long theorem names to break across lines. +% Thanks to Miquel Payaro for reporting this. +\def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily\trivlist% + \item[]\textit{\indent #1\ #2:} \itemindent\@IEEEtmpitemindent\relax} +\def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily \trivlist% +% V1.6 The IEEE is back to using () around theorem names which are also in italics +% Thanks to Christian Peel for reporting this. + \item[]\textit{\indent #1\ #2\ (#3):} \itemindent\@IEEEtmpitemindent\relax} +% V1.7 remove bogus \unskip that caused equations in theorems to collide with +% lines below. +\def\@endtheorem{\endtrivlist} +\fi + + + +% V1.6 +% display command for the section the theorem is in - so that \thesection +% is not used as this will be in Roman numerals when we want arabic. +% LaTeX2e uses \def\@thmcounter#1{\noexpand\arabic{#1}} for the theorem number +% (second part) display and \def\@thmcountersep{.} as a separator. +% V1.7 intercept calls to the section counter and reroute to \@IEEEthmcounterinsection +% to allow \appendix(ices} to override as needed. +% +% special handler for sections, allows appendix(ices) to override +\gdef\@IEEEthmcounterinsection#1{\arabic{#1}} +% string macro +\edef\@IEEEstringsection{section} + +% redefine the #1#2[#3] form of newtheorem to use a hook to \@IEEEthmcounterinsection +% if section in_counter is used +\def\@xnthm#1#2[#3]{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@newctr{#1}[#3]% + \edef\@IEEEstringtmp{#3} + \ifx\@IEEEstringtmp\@IEEEstringsection + \expandafter\xdef\csname the#1\endcsname{% + \noexpand\@IEEEthmcounterinsection{#3}\@thmcountersep + \@thmcounter{#1}}% + \else + \expandafter\xdef\csname the#1\endcsname{% + \expandafter\noexpand\csname the#3\endcsname \@thmcountersep + \@thmcounter{#1}}% + \fi + \global\@namedef{#1}{\@thm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}}} + + + +%% SET UP THE DEFAULT PAGESTYLE +\pagestyle{headings} +\pagenumbering{arabic} + +% normally the page counter starts at 1 +\setcounter{page}{1} +% however, for peerreview the cover sheet is page 0 or page -1 +% (for duplex printing) +\ifCLASSOPTIONpeerreview + \if@twoside + \setcounter{page}{-1} + \else + \setcounter{page}{0} + \fi +\fi + +% standard book class behavior - let bottom line float up and down as +% needed when single sided +\ifCLASSOPTIONtwoside\else\raggedbottom\fi +% if two column - turn on twocolumn, allow word spacings to stretch more and +% enforce a rigid position for the last lines +\ifCLASSOPTIONtwocolumn +% the peer review option delays invoking twocolumn + \ifCLASSOPTIONpeerreview\else + \twocolumn + \fi +\sloppy +\flushbottom +\fi + + + + +% \APPENDIX and \APPENDICES definitions + +% This is the \@ifmtarg command from the LaTeX ifmtarg package +% by Peter Wilson (CUA) and Donald Arseneau +% \@ifmtarg is used to determine if an argument to a command +% is present or not. +% For instance: +% \@ifmtarg{#1}{\typeout{empty}}{\typeout{has something}} +% \@ifmtarg is used with our redefined \section command if +% \appendices is invoked. +% The command \section will behave slightly differently depending +% on whether the user specifies a title: +% \section{My appendix title} +% or not: +% \section{} +% This way, we can eliminate the blank lines where the title +% would be, and the unneeded : after Appendix in the table of +% contents +\begingroup +\catcode`\Q=3 +\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} +\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4} +\endgroup +% end of \@ifmtarg defs + + +% V1.7 +% command that allows the one time saving of the original definition +% of section to \@IEEEappendixsavesection for \appendix or \appendices +% we don't save \section here as it may be redefined later by other +% packages (hyperref.sty, etc.) +\def\@IEEEsaveoriginalsectiononce{\let\@IEEEappendixsavesection\section +\let\@IEEEsaveoriginalsectiononce\relax} + +% neat trick to grab and process the argument from \section{argument} +% we process differently if the user invoked \section{} with no +% argument (title) +% note we reroute the call to the old \section* +\def\@IEEEprocessthesectionargument#1{% +\@ifmtarg{#1}{% +\@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis}% +\addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection}}{% +\@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis\\* #1}% +\addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection: #1}}} + +% we use this if the user calls \section{} after +% \appendix-- which has no meaning. So, we ignore the +% command and its argument. Then, warn the user. +\def\@IEEEdestroythesectionargument#1{\typeout{** WARNING: Ignoring useless +\protect\section\space in Appendix (line \the\inputlineno).}} + + +% remember \thesection forms will be displayed in \ref calls +% and in the Table of Contents. +% The \sectiondis form is used in the actual heading itself + +% appendix command for one single appendix +% normally has no heading. However, if you want a +% heading, you can do so via the optional argument: +% \appendix[Optional Heading] +\def\appendix{\relax} +\renewcommand{\appendix}[1][]{\@IEEEsaveoriginalsectiononce\par + % v1.6 keep hyperref's identifiers unique + \gdef\theHsection{Appendix.A}% + % v1.6 adjust hyperref's string name for the section + \xdef\Hy@chapapp{appendix}% + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \setcounter{subsubsection}{0}% + \setcounter{paragraph}{0}% + \gdef\thesection{A}% + \gdef\thesectiondis{}% + \gdef\thesubsection{\Alph{subsection}}% + \gdef\@IEEEthmcounterinsection##1{A} + \refstepcounter{section}% update the \ref counter + \@ifmtarg{#1}{\@IEEEappendixsavesection*{\appendixname}% + \addcontentsline{toc}{section}{\appendixname}}{% + \@IEEEappendixsavesection*{\appendixname\nobreakspace\\* #1}% + \addcontentsline{toc}{section}{\appendixname: #1}}% + % redefine \section command for appendix + % leave \section* as is + \def\section{\@ifstar{\@IEEEappendixsavesection*}{% + \@IEEEdestroythesectionargument}}% throw out the argument + % of the normal form +} + + + +% appendices command for multiple appendices +% user then calls \section with an argument (possibly empty) to +% declare the individual appendices +\def\appendices{\@IEEEsaveoriginalsectiononce\par + % v1.6 keep hyperref's identifiers unique + \gdef\theHsection{Appendix.\Alph{section}}% + % v1.6 adjust hyperref's string name for the section + \xdef\Hy@chapapp{appendix}% + \setcounter{section}{-1}% we want \refstepcounter to use section 0 + \setcounter{subsection}{0}% + \setcounter{subsubsection}{0}% + \setcounter{paragraph}{0}% + \ifCLASSOPTIONromanappendices% + \gdef\thesection{\Roman{section}}% + \gdef\thesectiondis{\Roman{section}}% + \@IEEEcompsocconfonly{\gdef\thesectiondis{\Roman{section}.}}% + \gdef\@IEEEthmcounterinsection##1{A\arabic{##1}} + \else% + \gdef\thesection{\Alph{section}}% + \gdef\thesectiondis{\Alph{section}}% + \@IEEEcompsocconfonly{\gdef\thesectiondis{\Alph{section}.}}% + \gdef\@IEEEthmcounterinsection##1{\Alph{##1}} + \fi% + \refstepcounter{section}% update the \ref counter + \setcounter{section}{0}% NEXT \section will be the FIRST appendix + % redefine \section command for appendices + % leave \section* as is + \def\section{\@ifstar{\@IEEEappendixsavesection*}{% process the *-form + \refstepcounter{section}% or is a new section so, + \@IEEEprocessthesectionargument}}% process the argument + % of the normal form +} + + + +% V1.7 compoc uses nonbold drop cap and small caps word style +\ifCLASSOPTIONcompsoc + \def\IEEEPARstartFONTSTYLE{\mdseries} + \def\IEEEPARstartWORDFONTSTYLE{\scshape} + \def\IEEEPARstartWORDCAPSTYLE{\relax} +\fi +% +% +% \IEEEPARstart +% Definition for the big two line drop cap letter at the beginning of the +% first paragraph of journal papers. The first argument is the first letter +% of the first word, the second argument is the remaining letters of the +% first word which will be rendered in upper case. +% In V1.6 this has been completely rewritten to: +% +% 1. no longer have problems when the user begins an environment +% within the paragraph that uses \IEEEPARstart. +% 2. auto-detect and use the current font family +% 3. revise handling of the space at the end of the first word so that +% interword glue will now work as normal. +% 4. produce correctly aligned edges for the (two) indented lines. +% +% We generalize things via control macros - playing with these is fun too. +% +% V1.7 added more control macros to make it easy for IEEEtrantools.sty users +% to change the font style. +% +% the number of lines that are indented to clear it +% may need to increase if using decenders +\providecommand{\IEEEPARstartDROPLINES}{2} +% minimum number of lines left on a page to allow a \@IEEEPARstart +% Does not take into consideration rubber shrink, so it tends to +% be overly cautious +\providecommand{\IEEEPARstartMINPAGELINES}{2} +% V1.7 the height of the drop cap is adjusted to match the height of this text +% in the current font (when \IEEEPARstart is called). +\providecommand{\IEEEPARstartHEIGHTTEXT}{T} +% the depth the letter is lowered below the baseline +% the height (and size) of the letter is determined by the sum +% of this value and the height of the \IEEEPARstartHEIGHTTEXT in the current +% font. It is a good idea to set this value in terms of the baselineskip +% so that it can respond to changes therein. +\providecommand{\IEEEPARstartDROPDEPTH}{1.1\baselineskip} +% V1.7 the font the drop cap will be rendered in, +% can take zero or one argument. +\providecommand{\IEEEPARstartFONTSTYLE}{\bfseries} +% V1.7 any additional, non-font related commands needed to modify +% the drop cap letter, can take zero or one argument. +\providecommand{\IEEEPARstartCAPSTYLE}{\MakeUppercase} +% V1.7 the font that will be used to render the rest of the word, +% can take zero or one argument. +\providecommand{\IEEEPARstartWORDFONTSTYLE}{\relax} +% V1.7 any additional, non-font related commands needed to modify +% the rest of the word, can take zero or one argument. +\providecommand{\IEEEPARstartWORDCAPSTYLE}{\MakeUppercase} +% This is the horizontal separation distance from the drop letter to the main text. +% Lengths that depend on the font (e.g., ex, em, etc.) will be referenced +% to the font that is active when \IEEEPARstart is called. +\providecommand{\IEEEPARstartSEP}{0.15em} +% V1.7 horizontal offset applied to the left of the drop cap. +\providecommand{\IEEEPARstartHOFFSET}{0em} +% V1.7 Italic correction command applied at the end of the drop cap. +\providecommand{\IEEEPARstartITLCORRECT}{\/} + +% width of the letter output, set globally. Can be used in \IEEEPARstartSEP +% or \IEEEPARstartHOFFSET, but not the height lengths. +\newdimen\IEEEPARstartletwidth +\IEEEPARstartletwidth 0pt\relax + +% definition of \IEEEPARstart +% THIS IS A CONTROLLED SPACING AREA, DO NOT ALLOW SPACES WITHIN THESE LINES +% +% The token \@IEEEPARstartfont will be globally defined after the first use +% of \IEEEPARstart and will be a font command which creates the big letter +% The first argument is the first letter of the first word and the second +% argument is the rest of the first word(s). +\def\IEEEPARstart#1#2{\par{% +% if this page does not have enough space, break it and lets start +% on a new one +\@IEEEtranneedspace{\IEEEPARstartMINPAGELINES\baselineskip}{\relax}% +% V1.7 move this up here in case user uses \textbf for \IEEEPARstartFONTSTYLE +% which uses command \leavevmode which causes an unwanted \indent to be issued +\noindent +% calculate the desired height of the big letter +% it extends from the top of \IEEEPARstartHEIGHTTEXT in the current font +% down to \IEEEPARstartDROPDEPTH below the current baseline +\settoheight{\@IEEEtrantmpdimenA}{\IEEEPARstartHEIGHTTEXT}% +\addtolength{\@IEEEtrantmpdimenA}{\IEEEPARstartDROPDEPTH}% +% extract the name of the current font in bold +% and place it in \@IEEEPARstartFONTNAME +\def\@IEEEPARstartGETFIRSTWORD##1 ##2\relax{##1}% +{\IEEEPARstartFONTSTYLE{\selectfont\edef\@IEEEPARstartFONTNAMESPACE{\fontname\font\space}% +\xdef\@IEEEPARstartFONTNAME{\expandafter\@IEEEPARstartGETFIRSTWORD\@IEEEPARstartFONTNAMESPACE\relax}}}% +% define a font based on this name with a point size equal to the desired +% height of the drop letter +\font\@IEEEPARstartsubfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenA\relax% +% save this value as a counter (integer) value (sp points) +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenA% +% now get the height of the actual letter produced by this font size +\settoheight{\@IEEEtrantmpdimenB}{\@IEEEPARstartsubfont\IEEEPARstartCAPSTYLE{#1}}% +% If something bogus happens like the first argument is empty or the +% current font is strange, do not allow a zero height. +\ifdim\@IEEEtrantmpdimenB=0pt\relax% +\typeout{** WARNING: IEEEPARstart drop letter has zero height! (line \the\inputlineno)}% +\typeout{ Forcing the drop letter font size to 10pt.}% +\@IEEEtrantmpdimenB=10pt% +\fi% +% and store it as a counter +\@IEEEtrantmpcountB=\@IEEEtrantmpdimenB% +% Since a font size doesn't exactly correspond to the height of the capital +% letters in that font, the actual height of the letter, \@IEEEtrantmpcountB, +% will be less than that desired, \@IEEEtrantmpcountA +% we need to raise the font size, \@IEEEtrantmpdimenA +% by \@IEEEtrantmpcountA / \@IEEEtrantmpcountB +% But, TeX doesn't have floating point division, so we have to use integer +% division. Hence the use of the counters. +% We need to reduce the denominator so that the loss of the remainder will +% have minimal affect on the accuracy of the result +\divide\@IEEEtrantmpcountB by 200% +\divide\@IEEEtrantmpcountA by \@IEEEtrantmpcountB% +% Then reequalize things when we use TeX's ability to multiply by +% floating point values +\@IEEEtrantmpdimenB=0.005\@IEEEtrantmpdimenA% +\multiply\@IEEEtrantmpdimenB by \@IEEEtrantmpcountA% +% \@IEEEPARstartfont is globaly set to the calculated font of the big letter +% We need to carry this out of the local calculation area to to create the +% big letter. +\global\font\@IEEEPARstartfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenB% +% Now set \@IEEEtrantmpdimenA to the width of the big letter +% We need to carry this out of the local calculation area to set the +% hanging indent +\settowidth{\global\@IEEEtrantmpdimenA}{\@IEEEPARstartfont +\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}}}% +% end of the isolated calculation environment +\global\IEEEPARstartletwidth\@IEEEtrantmpdimenA\relax% +% add in the extra clearance we want +\advance\@IEEEtrantmpdimenA by \IEEEPARstartSEP\relax% +% add in the optional offset +\advance\@IEEEtrantmpdimenA by \IEEEPARstartHOFFSET\relax% +% V1.7 don't allow negative offsets to produce negative hanging indents +\@IEEEtrantmpdimenB\@IEEEtrantmpdimenA +\ifnum\@IEEEtrantmpdimenB < 0 \@IEEEtrantmpdimenB 0pt\fi +% \@IEEEtrantmpdimenA has the width of the big letter plus the +% separation space and \@IEEEPARstartfont is the font we need to use +% Now, we make the letter and issue the hanging indent command +% The letter is placed in a box of zero width and height so that other +% text won't be displaced by it. +\hangindent\@IEEEtrantmpdimenB\hangafter=-\IEEEPARstartDROPLINES% +\makebox[0pt][l]{\hspace{-\@IEEEtrantmpdimenA}% +\raisebox{-\IEEEPARstartDROPDEPTH}[0pt][0pt]{\hspace{\IEEEPARstartHOFFSET}% +\@IEEEPARstartfont\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}% +\hspace{\IEEEPARstartSEP}}}% +{\IEEEPARstartWORDFONTSTYLE{\IEEEPARstartWORDCAPSTYLE{\selectfont#2}}}} + + + + +% determines if the space remaining on a given page is equal to or greater +% than the specified space of argument one +% if not, execute argument two (only if the remaining space is greater than zero) +% and issue a \newpage +% +% example: \@IEEEtranneedspace{2in}{\vfill} +% +% Does not take into consideration rubber shrinkage, so it tends to +% be overly cautious +% Based on an example posted by Donald Arseneau +% Note this macro uses \@IEEEtrantmpdimenB internally for calculations, +% so DO NOT PASS \@IEEEtrantmpdimenB to this routine +% if you need a dimen register, import with \@IEEEtrantmpdimenA instead +\def\@IEEEtranneedspace#1#2{\penalty-100\begingroup%shield temp variable +\@IEEEtrantmpdimenB\pagegoal\advance\@IEEEtrantmpdimenB-\pagetotal% space left +\ifdim #1>\@IEEEtrantmpdimenB\relax% not enough space left +\ifdim\@IEEEtrantmpdimenB>\z@\relax #2\fi% +\newpage% +\fi\endgroup} + + + +% IEEEbiography ENVIRONMENT +% Allows user to enter biography leaving place for picture (adapts to font size) +% As of V1.5, a new optional argument allows you to have a real graphic! +% V1.5 and later also fixes the "colliding biographies" which could happen when a +% biography's text was shorter than the space for the photo. +% MDS 7/2001 +% V1.6 prevent multiple biographies from making multiple TOC entries +\newif\if@IEEEbiographyTOCentrynotmade +\global\@IEEEbiographyTOCentrynotmadetrue + +% biography counter so hyperref can jump directly to the biographies +% and not just the previous section +\newcounter{IEEEbiography} +\setcounter{IEEEbiography}{0} + +% photo area size +\def\@IEEEBIOphotowidth{1.0in} % width of the biography photo area +\def\@IEEEBIOphotodepth{1.25in} % depth (height) of the biography photo area +% area cleared for photo +\def\@IEEEBIOhangwidth{1.14in} % width cleared for the biography photo area +\def\@IEEEBIOhangdepth{1.25in} % depth cleared for the biography photo area + % actual depth will be a multiple of + % \baselineskip, rounded up +\def\@IEEEBIOskipN{4\baselineskip}% nominal value of the vskip above the biography + +\newenvironment{IEEEbiography}[2][]{\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize% +\unitlength 1in\parskip=0pt\par\parindent 1em\interlinepenalty500% +% we need enough space to support the hanging indent +% the nominal value of the spacer +% and one extra line for good measure +\@IEEEtrantmpdimenA=\@IEEEBIOhangdepth% +\advance\@IEEEtrantmpdimenA by \@IEEEBIOskipN% +\advance\@IEEEtrantmpdimenA by 1\baselineskip% +% if this page does not have enough space, break it and lets start +% with a new one +\@IEEEtranneedspace{\@IEEEtrantmpdimenA}{\relax}% +% nominal spacer can strech, not shrink use 1fil so user can out stretch with \vfill +\vskip \@IEEEBIOskipN plus 1fil minus 0\baselineskip% +% the default box for where the photo goes +\def\@IEEEtempbiographybox{{\setlength{\fboxsep}{0pt}\framebox{% +\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}\centering PLACE\\ PHOTO\\ HERE \end{minipage}}}}% +% +% detect if the optional argument was supplied, this requires the +% \@ifmtarg command as defined in the appendix section above +% and if so, override the default box with what they want +\@ifmtarg{#1}{\relax}{\def\@IEEEtempbiographybox{\mbox{\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}% +\centering% +#1% +\end{minipage}}}}% end if optional argument supplied +% Make an entry into the table of contents only if we have not done so before +\if@IEEEbiographyTOCentrynotmade% +% link labels to the biography counter so hyperref will jump +% to the biography, not the previous section +\setcounter{IEEEbiography}{-1}% +\refstepcounter{IEEEbiography}% +\addcontentsline{toc}{section}{Biographies}% +\global\@IEEEbiographyTOCentrynotmadefalse% +\fi% +% one more biography +\refstepcounter{IEEEbiography}% +% Make an entry for this name into the table of contents +\addcontentsline{toc}{subsection}{#2}% +% V1.6 properly handle if a new paragraph should occur while the +% hanging indent is still active. Do this by redefining \par so +% that it will not start a new paragraph. (But it will appear to the +% user as if it did.) Also, strip any leading pars, newlines, or spaces. +\let\@IEEEBIOORGparCMD=\par% save the original \par command +\edef\par{\hfil\break\indent}% the new \par will not be a "real" \par +\settoheight{\@IEEEtrantmpdimenA}{\@IEEEtempbiographybox}% get height of biography box +\@IEEEtrantmpdimenB=\@IEEEBIOhangdepth% +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenB% countA has the hang depth +\divide\@IEEEtrantmpcountA by \baselineskip% calculates lines needed to produce the hang depth +\advance\@IEEEtrantmpcountA by 1% ensure we overestimate +% set the hanging indent +\hangindent\@IEEEBIOhangwidth% +\hangafter-\@IEEEtrantmpcountA% +% reference the top of the photo area to the top of a capital T +\settoheight{\@IEEEtrantmpdimenB}{\mbox{T}}% +% set the photo box, give it zero width and height so as not to disturb anything +\noindent\makebox[0pt][l]{\hspace{-\@IEEEBIOhangwidth}\raisebox{\@IEEEtrantmpdimenB}[0pt][0pt]{% +\raisebox{-\@IEEEBIOphotodepth}[0pt][0pt]{\@IEEEtempbiographybox}}}% +% now place the author name and begin the bio text +\noindent\textbf{#2\ }\@IEEEgobbleleadPARNLSP}{\relax\let\par=\@IEEEBIOORGparCMD\par% +% 7/2001 V1.5 detect when the biography text is shorter than the photo area +% and pad the unused area - preventing a collision from the next biography entry +% MDS +\ifnum \prevgraf <\@IEEEtrantmpcountA\relax% detect when the biography text is shorter than the photo + \advance\@IEEEtrantmpcountA by -\prevgraf% calculate how many lines we need to pad + \advance\@IEEEtrantmpcountA by -1\relax% we compensate for the fact that we indented an extra line + \@IEEEtrantmpdimenA=\baselineskip% calculate the length of the padding + \multiply\@IEEEtrantmpdimenA by \@IEEEtrantmpcountA% + \noindent\rule{0pt}{\@IEEEtrantmpdimenA}% insert an invisible support strut +\fi% +\par\normalfont} + + + +% V1.6 +% added biography without a photo environment +\newenvironment{IEEEbiographynophoto}[1]{% +% Make an entry into the table of contents only if we have not done so before +\if@IEEEbiographyTOCentrynotmade% +% link labels to the biography counter so hyperref will jump +% to the biography, not the previous section +\setcounter{IEEEbiography}{-1}% +\refstepcounter{IEEEbiography}% +\addcontentsline{toc}{section}{Biographies}% +\global\@IEEEbiographyTOCentrynotmadefalse% +\fi% +% one more biography +\refstepcounter{IEEEbiography}% +% Make an entry for this name into the table of contents +\addcontentsline{toc}{subsection}{#1}% +\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize\interlinepenalty500% +\vskip 4\baselineskip plus 1fil minus 0\baselineskip% +\parskip=0pt\par% +\noindent\textbf{#1\ }\@IEEEgobbleleadPARNLSP}{\relax\par\normalfont} + + +% provide the user with some old font commands +% got this from article.cls +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} + + +% SPECIAL PAPER NOTICE COMMANDS +% +% holds the special notice text +\def\@IEEEspecialpapernotice{\relax} + +% for special papers, like invited papers, the user can do: +% \IEEEspecialpapernotice{(Invited Paper)} before \maketitle +\def\IEEEspecialpapernotice#1{\ifCLASSOPTIONconference% +\def\@IEEEspecialpapernotice{{\sublargesize\textit{#1}\vspace*{1em}}}% +\else% +\def\@IEEEspecialpapernotice{{\\*[1.5ex]\sublargesize\textit{#1}}\vspace*{-2ex}}% +\fi} + + + + +% PUBLISHER ID COMMANDS +% to insert a publisher's ID footer +% V1.6 \IEEEpubid has been changed so that the change in page size and style +% occurs in \maketitle. \IEEEpubid must now be issued prior to \maketitle +% use \IEEEpubidadjcol as before - in the second column of the title page +% These changes allow \maketitle to take the reduced page height into +% consideration when dynamically setting the space between the author +% names and the maintext. +% +% the amount the main text is pulled up to make room for the +% publisher's ID footer +% The IEEE uses about 1.3\baselineskip for journals, +% dynamic title spacing will clean up the fraction +\def\@IEEEpubidpullup{1.3\baselineskip} +\ifCLASSOPTIONtechnote +% for technotes it must be an integer of baselineskip as there can be no +% dynamic title spacing for two column mode technotes (the title is in the +% in first column) and we should maintain an integer number of lines in the +% second column +% There are some examples (such as older issues of "Transactions on +% Information Theory") in which the IEEE really pulls the text off the ID for +% technotes - about 0.55in (or 4\baselineskip). We'll use 2\baselineskip +% and call it even. +\def\@IEEEpubidpullup{2\baselineskip} +\fi + +% V1.7 compsoc does not use a pullup +\ifCLASSOPTIONcompsoc +\def\@IEEEpubidpullup{0pt} +\fi + +% holds the ID text +\def\@IEEEpubid{\relax} + +% flag so \maketitle can tell if \IEEEpubid was called +\newif\if@IEEEusingpubid +\global\@IEEEusingpubidfalse +% issue this command in the page to have the ID at the bottom +% V1.6 use before \maketitle +\def\IEEEpubid#1{\def\@IEEEpubid{#1}\global\@IEEEusingpubidtrue} + + +% command which will pull up (shorten) the column it is executed in +% to make room for the publisher ID. Place in the second column of +% the title page when using \IEEEpubid +% Is smart enough not to do anything when in single column text or +% if the user hasn't called \IEEEpubid +% currently needed in for the second column of a page with the +% publisher ID. If not needed in future releases, please provide this +% command and define it as \relax for backward compatibility +% v1.6b do not allow command to operate if the peer review option has been +% selected because \IEEEpubidadjcol will not be on the cover page. +% V1.7 do nothing if compsoc +\def\IEEEpubidadjcol{\ifCLASSOPTIONcompsoc\else\ifCLASSOPTIONpeerreview\else +\if@twocolumn\if@IEEEusingpubid\enlargethispage{-\@IEEEpubidpullup}\fi\fi\fi\fi} + +% Special thanks to Peter Wilson, Daniel Luecking, and the other +% gurus at comp.text.tex, for helping me to understand how best to +% implement the IEEEpubid command in LaTeX. + + + +%% Lockout some commands under various conditions + +% general purpose bit bucket +\newsavebox{\@IEEEtranrubishbin} + +% flags to prevent multiple warning messages +\newif\if@IEEEWARNthanks +\newif\if@IEEEWARNIEEEPARstart +\newif\if@IEEEWARNIEEEbiography +\newif\if@IEEEWARNIEEEbiographynophoto +\newif\if@IEEEWARNIEEEpubid +\newif\if@IEEEWARNIEEEpubidadjcol +\newif\if@IEEEWARNIEEEmembership +\newif\if@IEEEWARNIEEEaftertitletext +\@IEEEWARNthankstrue +\@IEEEWARNIEEEPARstarttrue +\@IEEEWARNIEEEbiographytrue +\@IEEEWARNIEEEbiographynophototrue +\@IEEEWARNIEEEpubidtrue +\@IEEEWARNIEEEpubidadjcoltrue +\@IEEEWARNIEEEmembershiptrue +\@IEEEWARNIEEEaftertitletexttrue + + +%% Lockout some commands when in various modes, but allow them to be restored if needed +%% +% save commands which might be locked out +% so that the user can later restore them if needed +\let\@IEEESAVECMDthanks\thanks +\let\@IEEESAVECMDIEEEPARstart\IEEEPARstart +\let\@IEEESAVECMDIEEEbiography\IEEEbiography +\let\@IEEESAVECMDendIEEEbiography\endIEEEbiography +\let\@IEEESAVECMDIEEEbiographynophoto\IEEEbiographynophoto +\let\@IEEESAVECMDendIEEEbiographynophoto\endIEEEbiographynophoto +\let\@IEEESAVECMDIEEEpubid\IEEEpubid +\let\@IEEESAVECMDIEEEpubidadjcol\IEEEpubidadjcol +\let\@IEEESAVECMDIEEEmembership\IEEEmembership +\let\@IEEESAVECMDIEEEaftertitletext\IEEEaftertitletext + + +% disable \IEEEPARstart when in draft mode +% This may have originally been done because the pre-V1.6 drop letter +% algorithm had problems with a non-unity baselinestretch +% At any rate, it seems too formal to have a drop letter in a draft +% paper. +\ifCLASSOPTIONdraftcls +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** ATTENTION: \noexpand\IEEEPARstart + is disabled in draft mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} +\fi +% and for technotes +\ifCLASSOPTIONtechnote +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart + is locked out for technotes (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} +\fi + + +% lockout unneeded commands when in conference mode +\ifCLASSOPTIONconference +% when locked out, \thanks, \IEEEbiography, \IEEEbiographynophoto, \IEEEpubid, +% \IEEEmembership and \IEEEaftertitletext will all swallow their given text. +% \IEEEPARstart will output a normal character instead +% warn the user about these commands only once to prevent the console screen +% from filling up with redundant messages +\def\thanks#1{\if@IEEEWARNthanks\typeout{** WARNING: \noexpand\thanks + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNthanksfalse} +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} + + +% LaTeX treats environments and commands with optional arguments differently. +% the actual ("internal") command is stored as \\commandname +% (accessed via \csname\string\commandname\endcsname ) +% the "external" command \commandname is a macro with code to determine +% whether or not the optional argument is presented and to provide the +% default if it is absent. So, in order to save and restore such a command +% we would have to save and restore \\commandname as well. But, if LaTeX +% ever changes the way it names the internal names, the trick would break. +% Instead let us just define a new environment so that the internal +% name can be left undisturbed. +\newenvironment{@IEEEbogusbiography}[2][]{\if@IEEEWARNIEEEbiography\typeout{** WARNING: \noexpand\IEEEbiography + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographyfalse% +\setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax} +% and make biography point to our bogus biography +\let\IEEEbiography=\@IEEEbogusbiography +\let\endIEEEbiography=\end@IEEEbogusbiography + +\renewenvironment{IEEEbiographynophoto}[1]{\if@IEEEWARNIEEEbiographynophoto\typeout{** WARNING: \noexpand\IEEEbiographynophoto + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographynophotofalse% +\setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax} + +\def\IEEEpubid#1{\if@IEEEWARNIEEEpubid\typeout{** WARNING: \noexpand\IEEEpubid + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidfalse} +\def\IEEEpubidadjcol{\if@IEEEWARNIEEEpubidadjcol\typeout{** WARNING: \noexpand\IEEEpubidadjcol + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidadjcolfalse} +\def\IEEEmembership#1{\if@IEEEWARNIEEEmembership\typeout{** WARNING: \noexpand\IEEEmembership + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEmembershipfalse} +\def\IEEEaftertitletext#1{\if@IEEEWARNIEEEaftertitletext\typeout{** WARNING: \noexpand\IEEEaftertitletext + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEaftertitletextfalse} +\fi + + +% provide a way to restore the commands that are locked out +\def\IEEEoverridecommandlockouts{% +\typeout{** ATTENTION: Overriding command lockouts (line \the\inputlineno).}% +\let\thanks\@IEEESAVECMDthanks% +\let\IEEEPARstart\@IEEESAVECMDIEEEPARstart% +\let\IEEEbiography\@IEEESAVECMDIEEEbiography% +\let\endIEEEbiography\@IEEESAVECMDendIEEEbiography% +\let\IEEEbiographynophoto\@IEEESAVECMDIEEEbiographynophoto% +\let\endIEEEbiographynophoto\@IEEESAVECMDendIEEEbiographynophoto% +\let\IEEEpubid\@IEEESAVECMDIEEEpubid% +\let\IEEEpubidadjcol\@IEEESAVECMDIEEEpubidadjcol% +\let\IEEEmembership\@IEEESAVECMDIEEEmembership% +\let\IEEEaftertitletext\@IEEESAVECMDIEEEaftertitletext} + + + +% need a backslash character for typeout output +{\catcode`\|=0 \catcode`\\=12 +|xdef|@IEEEbackslash{\}} + + +% hook to allow easy disabling of all legacy warnings +\def\@IEEElegacywarn#1#2{\typeout{** ATTENTION: \@IEEEbackslash #1 is deprecated (line \the\inputlineno). +Use \@IEEEbackslash #2 instead.}} + + +% provide some legacy IEEEtran commands +\def\IEEEcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEcompsoctitleabstractindextext}{IEEEtitleabstractindextext}\IEEEtitleabstractindextext} +\def\IEEEdisplaynotcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEdisplaynotcompsoctitleabstractindextext}{IEEEdisplaynontitleabstractindextext}\IEEEdisplaynontitleabstractindextext} +% provide some legacy IEEEtran environments + + +% V1.8a no more support for these legacy commands +%\def\authorblockA{\@IEEElegacywarn{authorblockA}{IEEEauthorblockA}\IEEEauthorblockA} +%\def\authorblockN{\@IEEElegacywarn{authorblockN}{IEEEauthorblockN}\IEEEauthorblockN} +%\def\authorrefmark{\@IEEElegacywarn{authorrefmark}{IEEEauthorrefmark}\IEEEauthorrefmark} +%\def\PARstart{\@IEEElegacywarn{PARstart}{IEEEPARstart}\IEEEPARstart} +%\def\pubid{\@IEEElegacywarn{pubid}{IEEEpubid}\IEEEpubid} +%\def\pubidadjcol{\@IEEElegacywarn{pubidadjcol}{IEEEpubidadjcol}\IEEEpubidadjcol} +%\def\specialpapernotice{\@IEEElegacywarn{specialpapernotice}{IEEEspecialpapernotice}\IEEEspecialpapernotice} +% and environments +%\def\keywords{\@IEEElegacywarn{keywords}{IEEEkeywords}\IEEEkeywords} +%\def\endkeywords{\endIEEEkeywords} +% V1.8 no more support for legacy IED list commands +%\let\labelindent\IEEElabelindent +%\def\calcleftmargin{\@IEEElegacywarn{calcleftmargin}{IEEEcalcleftmargin}\IEEEcalcleftmargin} +%\def\setlabelwidth{\@IEEElegacywarn{setlabelwidth}{IEEEsetlabelwidth}\IEEEsetlabelwidth} +%\def\usemathlabelsep{\@IEEElegacywarn{usemathlabelsep}{IEEEusemathlabelsep}\IEEEusemathlabelsep} +%\def\iedlabeljustifyc{\@IEEElegacywarn{iedlabeljustifyc}{IEEEiedlabeljustifyc}\IEEEiedlabeljustifyc} +%\def\iedlabeljustifyl{\@IEEElegacywarn{iedlabeljustifyl}{IEEEiedlabeljustifyl}\IEEEiedlabeljustifyl} +%\def\iedlabeljustifyr{\@IEEElegacywarn{iedlabeljustifyr}{IEEEiedlabeljustifyr}\IEEEiedlabeljustifyr} +% V1.8 no more support for QED and proof stuff +%\def\QED{\@IEEElegacywarn{QED}{IEEEQED}\IEEEQED} +%\def\QEDclosed{\@IEEElegacywarn{QEDclosed}{IEEEQEDclosed}\IEEEQEDclosed} +%\def\QEDopen{\@IEEElegacywarn{QEDopen}{IEEEQEDopen}\IEEEQEDopen} +%\AtBeginDocument{\def\proof{\@IEEElegacywarn{proof}{IEEEproof}\IEEEproof}\def\endproof{\endIEEEproof}} +% V1.8 no longer support biography or biographynophoto +%\def\biography{\@IEEElegacywarn{biography}{IEEEbiography}\IEEEbiography} +%\def\biographynophoto{\@IEEElegacywarn{biographynophoto}{IEEEbiographynophoto}\IEEEbiographynophoto} +%\def\endbiography{\endIEEEbiography} +%\def\endbiographynophoto{\endIEEEbiographynophoto} +% V1.7 and later no longer supports \overrideIEEEmargins +%\def\overrideIEEEmargins{% +%\typeout{** WARNING: \string\overrideIEEEmargins \space no longer supported (line \the\inputlineno).}% +%\typeout{** Use the \string\CLASSINPUTinnersidemargin, \string\CLASSINPUToutersidemargin \space controls instead.}} + +\endinput + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of IEEEtran.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%% +% That's all folks! + diff --git a/MLExamples/icf_4agent/docs/summary.pdf b/MLExamples/icf_4agent/docs/summary.pdf new file mode 100644 index 0000000000000000000000000000000000000000..022841515ec62f801531bd64cb050bc285b77c98 GIT binary patch literal 274343 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 TowA)(&LG3-&N3L>YH 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℘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

jdwCX0;L0g@PO<}(EIzeE>mq!vEX9YWM48tnzIF z5!Y4|WipS#_3_wDF=?-9#6g_It+s$63sL~NB^`3z>%}_YP})~)TC8%!ZCw*YTEn*J zBBoBYcricYTPD5)XL*IlFOIK<$I2pD<`6c2k;H6{qgM%i)Le$fFAzk-HsjDCK zsmapb!K{jZOYoxhqpxLK-k}W*`_hwh$;bF)HxPL34;r}=bEQ)5zmA4)+(wEP zZFOpQ|%1X|8C%gJJ-x_C{Z=GgjT8Sm(SAGC)}KGF(GZJ@3t zg|u7Bk-cg8HFzkPo3zaTJHwv*nYb;j$$D2C2b0ahqhB+73ahEq9|Q8YrA>bM0)$>8 z`Xq4b?B}l$2S8c3j7WNsREJ^vjuxl@Ruzj5~S#e@SnA6YUYP_o# zOZ5^`62(vFj>@_gn&e$s;PAY>r@1)oYU`gg%vf5>5DMQtMcSZ9jRd{(kMeJ+12u!_ zMIP8%U!IX_{+ zwe1{f+fMe8OCg4Qq@z--(`SNzf4Tt3sPh)5M>u^91s72Wgo zt2>>ndr|akLy+LSndeO5@VrJ*upKi%@9|`4mDEA%#Q0r>8c^eT+8>up9z$gOds;A2Z zYy=!H{LtL3IW_-{00^(*opX&ZLX-?Xf`N$M2j@ab)Fe@t3iC-3c)C%zU;VG31o4By z?e&lH9p@4Z*!ECZ^$)*@a0~dS=Pn_R!4Yhd_Fq=!b%ITx9RykLr^?LTl;H=(fR;N-ni|gdu~oZ zRW=P1IltE;uMhgt1}^&5!B&o(d(_o?fl2eRY&N*~$AMf_ev-4Pr!A4^%q^QwAtjTV z6tLT?Wzg8K2ShOHl2F$AkH(Kz2fImTUwz!shuNFsy#Vt+~t) zg%o)MXin$P(4)&-bM`=t8>j>zUjNRhV_wOD&=N#9(s>VAQ)hU#TL1xeghn?Bc_~A6 zT*M~53WIO%v?I5tbP5B;*^L}&Zl?ZV#xm>a6+ z<@1~rQOZxJh@2BE@dl)_Ot~nZg+YYLaz&ip-QB^-2xDyOu5nhmjJR+~adgbjDO5k;GdEKILlS&+R9RPcBy_fpX8 zLVxlsdRSvd=6HWtNKdS-=S?L+m&h?Q+;9$8Hu0rm&oW0#iDZMPr7dgDWl{_;aru#( z&QWYMnabo0#S#1q1hQUKTDffWi&L)^YueVcISsd|=w@Y0;U}{b8h_q|SdDg9h_kTL zYz|r@cOHZl#NxswKTX_>id&hAe-xidZZ%o)x9sm&!1FG*srPjBK?uPGg%X}u2AJtV z@UUB{@U(ENoK{r+s}$H$w^~3V@9XQ3-Na!&GAe0e2B_D}_v0odpl^H+Gv>9g`M!YS zliXD$3y@=+$n6Sm1Vs?c;@q3!L(DlGeLt@N?KHZEY^>03KbzCSEG8L`&2H1V*jWZf z6FMrLVIk{f&KKAk&rv*ykfeYhadyuQGBO=s?X)7od5%J5>TSXIbdC@dc9Rx>KfI{h z60nc2<7zhN;L)hU(UFRC#SFo?5ic+=PrYx}HR{Ae@(@J3Uf;7X|qHbYb*@o%l+#JXl6C zqRpRi#fO)VyIQt8ES;>-NzA=rA^GOXE2teVHhn<$PrYOkJ^~po=!4{+ke(3qq!ovp z`bsotFLVu$k+fWQ&x=Tbg6*7H2&P5bx`yU~Up1?$I|T64XSu4&pX00A9T`>dcVWdi zHb355#k|s}8rMAny`$y^Y+sa>;wGL1IeBU@P}EASCbS&o=)g?DqRa?!_sK~0Hn3LH zAGu@s32Ma1g?=12Zb(Y%5cN~-Vi1wZf*I(c3*$$yN!d#Y$TbRCsCdSfC2*_-loTJ| z)m(Ok-w$I%Ao1ArV~|y>K-*UopW{^{r5Rp_zHm|T8I|Pi?DVRZvNI{y{hVc{-Z^e` zKH=7yL$|29nqCRY+OhZa+Pvc6#w9@EYxT0KmC!e9vr#qr<60J)jOtwd(V~#gA39p2 z6}kJ=C@|>!Yczn^7jBk6d~cGZD-i1%>cBLy^wq$5yf#R8pyubfv&PAD#mW1lH`hV* zQ!}C`zeb#nzDHu5973A`O({FNlF2Sfo%XAxxR;tfWCY*p)G zwXh62a)kX?v`R>=NK)8_Ir2N9FXN*i4%9ar(Vg1Wp6E4&4`s+}KsEf={P zZo2d8v=>K&g!GFdF}B^;R)?g@JkS=&)x}dP`h;2;8kX}dU0}!};l0wpr=Rg_V@fUX z+LG@3r(^H7s{OqCt*q7Vi-k9bW;-i>wnce(&);)YpKflYK~?G{J%uQbF$HCXdA&6} zF??Gz;taYt#ZDel?KszZSVgbmS?D~^l;-OTK4;r>jyNlS+c`6m?~!|%gt-UGR`!+9 za7^KAu&tmQ@^ibzCR~LqTl}XH9hTmyli!bZ$mv$4dDSSkZ%^oq@OqDN4r%>P%|~s= z=*u#`&YV>2mojM`+$Gf$g9KnG*jpO&XcVK^J-@eE=`umiEYwd>BT#&C4%z_yoaXn^ zbrrua>Rbe~xb8fNsm2$T<>a6~57T>uh|cdhVs>;DJ>Sq+jejT!wW-cuYJ}U4Fz#5L zyZ>4TErRL)a!lU)?z#Vj3(+Kmm`P;}SGxGq>)VFx(hQ856>05Ksj+90&7VXhYE%(? zMcxsIwfF;j>_wzNrlg@ZOihrPL?K?%`j!Y+t-(bZMNEY2Q{V4OZ}OY`3M?XPm00jl zh>}!4j#S4YP>qte*w|T4WYw0v)80HUZGkIhnB8Xpjk=?S zsK5N=nQVlhNs1dWv;4}Xy)sMzh2Pb%0I=>g6xEf1ZmM+ ze%Z{gR)Yyfx$>m9q*caO_ii0TJ2NP4-r})EJx{@0cKj5RFiDM@lOg(JyP?pw|HZ7Z z1}iMp!Mfpo_|&n~eCb}^$7gQDRp*76X+Oir+Prvq2z!gV6zP^%cw?Xi8@6G5HI*{v zeM*!Mzw%z|sLD*xCd{l6-r7Lq&t^bY4 zRP|!3mvZ5k?gIS};&hLwO|GLC6FlL3-`3C5ufF_usf&3nDo);v@ono>}QlY1TUl!Y#m+v(vOQBEBOlnO4l1DxLYVw*WW%&HQ@W3sfs-uoQlhCh~ zXPKM@8bV{DsL@z_gtTo2!&5Q^7t8nU+})S*$UxiBkg`NS%ef zajw2gZYJnCONL{dqP;N%yn-9d53@CXa0!m1Rlo$+e+fS~p661wJE7v_ythsYW6+`z0CINrszQ|F%SPxc zcQYESLXljdfwlY;Dmz~OIoV38@=W}}^mNtU3Xa_K72=Va)@kC(mAIAdY-_Eh-h1R^CGq=WK@T-p|$JgDvYo!KOzQ)kZs{g)@Li1*TftK6R9{e zU{ZF5OpI`LZ${Ew5gRBjp{m;`!`brnD%L7b{93R^?llcubX2U71e--?PA++_}11L!Bhx#LHhQ z_8N_VIi3l9!$L4P3|!MsVUf_*CdR-H)dNX$t#2hiX`2PamtVgPV1{=pl5rX>sx)eE zTqR)&)jh)S;5h2AhSVgSKZ56i9NcpWnRKYAXA>g+Tz|4%pDBOA5%2L5%sd!EHTCFq*f6xgI4LS_v8R}78E{JpW7h^K zDdKHVvl7qD)yE6gV~sQtIHT6BSK`ZiAbiH>JxQ+^^|5?-fGK*zDMTZ@Q5veTKWxS0 z?GZEt_Tpwjm}xM7WaEe9>(j+oa_2?=%o;K^<#$Yv%Q6-sbI$0XA{*c%Hb=cV4f0&B zgJHn_9cD_j?Oy#+L_ve2Fd<|=!mJ}|rJ_;yM~R<>FLrY8(Ro@8`D%>$#ru=O3BwN5 zqEV~@%nC2?Rny82dY^qOPeW*0o+iPLpfh*wH||#~U!E6DU!MdRvPL0%Q3IGK2}xLK zD!FOQc8y5pTWRK~;j`7GzVab%>}P@>xT_?~!E3z|s&95ZfvVKO)7$HJnGVeLfk6Yy z1NB3G?O|^x*QDagokuX3{xQEv714M-_&f#?M8!_-Ay)d9<-j8ptr}?*tCc^*j60HT zWm|A}k#tl&i8$F10WVW2{a4?-ioC(9s$~%t`bJ+ci1Sbqc)It0z7p;RA~wQ)M!#a= z=%l-I-UVC=!H6BEl)OyTG<&wGnSfYEvF>_x?y65Tjic`%)!<%7~;LqC{R0j-WCMlL~QCsQe`D z#BVzc;^ia7=uHrrfpuiMQ(QSV?Vn|uUqSY2UgAtUiuX-PHIYoneO79Qu=h>%_rU{g z3M&elGpe@MXy3aIWEYepCfFTW%dGr&p5pJ$-6k3-wKqG??U$meoUQ~`M zqcH*pWHF`42!%6X+4n+{azdg1@G8g1r1jfeLbD?7h{p^y1k`Tlq?O@>%H%WzuAl-p zjyQFpzNVz%QB1KQa;BBCr}fne}Xs>VU8l zKkH5sjUFhcTtZXB*`u!WjUlG!B7qoK$W%7VAtHHugArl(X1vFVe5Y{q<$?++a!ziU znCHkg)HJ^#^y6CQw5U9PdMCG4oDV|JZSt0*L0^tIwDdnWbAAj9Kb?Mz{|Toqc4g(CKetUm8{Ge5XoAv1><8x1Vm0ms5{lBNK@e z$Z+AvdDy#CQ`d%{>3p?bKFAm+(Z%k2vYz=WpNe7IwOx5;i;zDh_&TY`+{~60$CDe6 zAH~vk!_iY2q_wdjv!8x)n^2Tr9G!GFBdC|IO$KtDx!#T0wa>#9apn4t3y57C+zR-}%rMCW>G5L)7djmEN*o}$ zohBGAkmizL5>arhQ279|Xugahdzf4&iZM(lPRMFux;+>?Y8r zpgWcir!^h`vA2#U!CNEs<-^Nbtyzg=R9NmG?f3;d=qq_4t^s zFB1Hp6tVLp4neh|x|{`nu%NHrK94LHK~He_l@;o9GYb;WFU3J^80L9SlT|6`YSO6LJ|pCAl~$J6J6MWxf#>p=Rl^U zn8`WT#uDGzXDz*ov2McG%CD$cJFTie!}=75GW6uZj{i{Sb7aV>JjY6vL?H) zbfmv1cB9s)MJzTvHc=NBNGb>-3|d;Tv52~cQo?`%v1NPO1lpXsCa7c7Fu@Up+!uvt zfxOrVWg*={*F9kJH2yW*$gk){YI-Ij?{<+HrUBzeC;AUuyFTF|ogGUY=?idl)_wzY zk1Ihq!gW8ri&&dTH1uAz>C_6T0y&kN5?QG>=ZA|)F6P@&hUb?J!5e?$w2QippdVAa zw({uciT>)h%Ljh@_VP^|Qi!gz()km_chhb*qryqo!~KAgSc$B%7j07gwjke9n+7bm z?AgU}GVrJ`bc4YtuDSk95(`fFVs_HbDc|gN9P0vvC)nHdrbVko2E}hQ1k0;tJ?TaeDc&|E!M@L?`@RjU^z=BavN!=s z8a1ao>w_prvO&I6%iJ?9tLG_?W(XfUP(+O-K!=>~v!2f&cj{Kp&A!auvKy8%~M>W!M1uIF|`6IId z?N>+{dRuHo-4ZBHJ)7U`Jm}0y^mWkBsy?7${s?G%y#nAkOu39B z=Q2ZKUYF1?kdd`bHHpN1L-GvpB&~J!b}2Cd+XN!p;Va}AcfIfg^dpwlh>}b^dI>Oy z;Miu9%{U1q7B5EdyQmAG3}>=byI2~@n3ylf5=<+>*4+meY;gTv$x z$skWg<%g8XFB&X1a0(+!CCBBZ&qPyuyMwSEHh(DoFD;zrR&|9!Ozribjkcfx{+kg3 z82KQ@(_6Ahfrz=KkOM3DW)`bbX*LnVpz#Am2ZK9LVS=}0MT3j5#AaSJ+&}tV|RXJ5EM6n?@=P#o&??rA#+W6N7KI*Z_prUy?tb+-D%nKWHOYEjhdz3O-j?w24 zymuYNuqoXK!|_05>t7rrv&+j54N5% zd&YV1(yQPw_&e*&GWzi<{S($7zY2&LrzSk!LRR^o`yQ#9)>Qd~tLCq6Q`}Xq-bCl# znqtN%D}L}bqR)?q-qKyCzdX*!a z6r_V=qu-@Ur#Iq%D2SPukO}WZjqT99yfTR%HQ=E0ItzAO&*+{O`d)@&E7T$8bL^%r z^d6xu2^Qu9nq%-{A?tAsL(QQ(Ji_y2mmWq<+E0DW z(1Mqi^uX%!bPK5Z&3UXVQ6JK6rgRRZCxlX(Amwfir(*Il#KZOLG~q@0XhI$w?i{o> z{tOKtn);U+S|`Y;sT6l!Yr&**Nf7e~8#X=&YM@~(`Diu}T1I8kNHW4u7;>BLA~qld z$W$6cRrg!Y<#ZZ2^0z)0_MYH}Jg>kCu zbhqdn`O~Rsz_04m8!_r0r;MkGIUgdTwUROT4jXtjV_6nb8Gl)P@@!e;OXr3BBNa23 zBV}ewwBf99me^rZp)Wy;$2N(x^5WgaCip@@~JtTjz0j6FWG)x>j-- zg~tf=%#a~|%5lC<=S0jDo2PvE?j>Jaq*cAJ^)ByiAsfolAMiJhx(`F6MadYeTH}<^ zgRT&sk9zWUr6x^CacN#Zrlsj46jP*#&6lHT zN@YrCjC}6q#}9_rkHZOvE|AMaM`eRy4fk5wIyr)xEOA3YK)VA9BWdyODdR35c?dR? z_E}Va-C<8@I6FeNNlNRSj@wI&w*W1^<+4R^Q|fA>eAtlq%@sG>f{op!jV{Sb7^TBN zynoH?PW}WU5stE|EhJU{xB**|f(dhd?}Y1Jzw)e*Jh%ec@#rO@|E6uRo*+UFVpKH) z5Be4Eh(;Qq)Yhxsae;#|7Z;rrIeXJJbsBzRui5E18cK7}w7%Qke@fDTz)*7NiuAKH zo)eaXi_)Y%4b0+&c?F|2RO&_=x=Akl-eh)9bsV3rf4E)OMZb{+W{T^5hN5%uJl2d% zF@&RzjE(PTHy$`yj{TFH#Jjp7NI-cTu z&JDs53HO(KZf{zJq_Z&$z;34B#$*vwV*1bFrcUufU|p}S6H}qK5>UO%6xdYFuzoHm zkapg|cwoi))pJ}+oEH9JnZUg~gv%55#AMRYv0QjJT1Z}*?&J`$4hB^fh>XTrb756X&|#%T1`5pv?;3X6Cxhs*EHR~RCmw0+RE;U09fw=M0- zT=^Y`-+_#TV>(#(vP>yd+;_<2f(e{=bX%fQ5xvc@t9~`3Nv}B#kgqH6V zUOT<$N_M1&q6w6YC|K6O0rH^5+zwBle8d-3Ea1oy$AEcD0#%2SvBEU}V03O#jnFV3 zWf3r&EPBds*bpwk%_D)7m&EDhw?!;FvG4$Op*>cYZ)n7@NlTS-bG=w^y0u{N8uvJF zZlQK(x%p$mb}voNJs~Zu4^Rj*s@H*gMirZeQi=$RC0lu_-;@f< zg9n`R78*gAjA-)A(mxYgPa16omV3+pusZ(TErmEz8mlc+ViQC>S9>KVv@ED z=PI~a9Wvnt&#bEDp!~rThVY(#fsuPtN>J2;jk>>p_;IosYH{ExCnjET&Jr^!WUKWB zt2K&@Hx$B>O_jX%yv4xkSXSQ>y7`$&MLF#0*V+b~E!Ea`HI@CYIHJ2xg$X3Y%q{<- z`y<>TfI&3I`n*-3%>puXUS=#A!QWIi)s|7Y==|P7+~iRqMI!^-Gv~Y|Sv*!|0#phY zU=@pKojt)0tQfJa?tVQ_d^11h-yowr4+dX;3DcRu6amazNoVLz?KOQ5iTG~Ut^xtD zsp>Ql7iGNDAeSUNty}I>GouW6Kaj4o1f!w*#KYHtzaHWz@)g{2NHP=`X4xN?bM}Lu zTdtGC$S@bS?my_)f;4*^W?wa9c=X^gH|CMl`LuBM&D+yq>(dPh9r86DnKbUrlq%ZmzrwmcG;2mL#+Bh96F#TcTy?*-IO>b(uH;@0Gs=4m{FH* z#6*me|1&Jc!hAB?k=Lx0J$$6eEWyJy03m?Gb<jGF{(~)wqk5k4PgLw9HLSt*F0>Py*}gu@ICgj9;lE-t1%T+YP3CP!Jmkd zFnkA77=q3Bl3COXT|u4{&LO-29o$w^OQcYJv0>?>J+q;O z2pL{DZyyw>VQf%XR$LWCV$BuiZ_cdE$#HAE2sRu=Q?N5e^0nIMq*r@o!6$vfzcssc zaJpYwJ66y$V>$WR(k_gqj-8x$WNyyRxN>#sybU!C90uU{P2ZL&gk zh7cT%5?d>`zeWZxoy?gLsqdxQBXxM$ z`&^2_`wf|2X^JPlrH#+AN*!1S!?;o1A)!DO939Im#7q%Y+wmzZlV9G&hs<~LR9+$I6jrPL9}y}<8|k815jOgu_K z*a{O>&fYeU>(Gk=vT+c@e#32WJ(er*KcLZ;E5Iu?%1+^-tR33SY%NAk?0jwbxmhms zd4&oM5rON=G zFqYZ5yrs*-ir`&BQR(?kapAxXqlzf{OlvwO~AjgO3jw}T0fcx7-X+lS0CZ?hsqyc;3`vX_l9u)K0A)@5WJhrHDjf}H$y>xVImX{PldNh}C;QEb>DpNg_|bE=3By$8ezzzw z<%w9a5z0)4apy&YwS6P$0*7i$q@HmaX-8kduwZzW_u{^v2YJBS~q<%sfZB0x2 zr>NIHP8~iuk(KR1O@bXp74kRNpaOY<`WZA^5=#%;Z{dq$x*YL*6~j zYjk5)lRlCV!jxPk4BtOF-mbaYjZO0%ewEs@-*2>`^rh6dKIeqvjnMLx#|M<{Q<#~L zuO(uBr3|VOU6F@x8+xm-;u!>PS4>b*7k4Q#AV1h%tpyUD*E~{Pzx|&GdQ2 zkv~PIfX)HM>0_1-UL(-c|J^{&;BU!^g6o zZAeQ^z)h7JWKyaop`z*$Udj{?g+tjGF>bs44t_)*BE|{eJ?a&DoqD{&cLAo z$L!}p4}o9D6BtHi&-!wCt>K&$rg{?tJ*P;e>)W~GM^`D=8>sE>f&9tOfPQ)1ai?Q5 zzA(g(tn|JbD(LT+WJk2F9m#!QJyR1Vy|#JtArJ0Td2MMz4Hnr6^F|p-;W4q_vmJAR zu>2}>LxG|;XHzHmsk?`bX>@Y=%b1fs7AQn8*$kf2EPZo(F_6qO>nMn*u(@#%a=Kp5 zNMl_*R*aG|kcC-ECv4$LMJ5trh0uYBzTp{tn(Vy<_aQ2JmYX<5C{FRThM+$GCvBfv z^$=zb460DziYT92)=T&u@jw@pW;z;-muoAEaoc+d&GcpGUDTWA4zyg8#?tAbIIWCd zx>EGS`j-?ECY9!xt)F$14MG=}0W)DH)3f%~x`vv_)lRhd`J3#s`4HtSHfVaZZ?GYU z^U}QPQF}|^ty%#HF%z?3U$+hf7KTr$+_7s$zCt(XS^0VzJb%E@L7Cj^JIVHP%&-Pu z2`{{nl^5?1`gCeK}2QI<%w3S5oneD)u_@)Q$}TsrwibrFNFNh8|f zOi^ON&LWno)M!b4!YX>L>j2|YLi&Mwa2TpHfA6`ziRYB)4T&oQ-gKH8Fn*$$lHn(v zi$y!y`X&^cwQatOJ&Ig(|5S=2msdXdH#w(9Y2~l!js_-=yDB^Z#i`W}bLo2<$zG;J z23{eISH3?bK?d8x>dhcd$-m0v_QW?MS-a4gNkj9Eob%B{Bu(K|9|IL0VdGY+?(*=b z(sD{~27db0>vJczMrUFl|2|djzpn^`fxV2Jvr=~rOL5!b8x5K)WeP)$#|{t7N`Mdb z>Zq&9Ht1(LdehSo9lYlTMC_5tEtd5wYoRpbHR~RswVp!kPN=BO87fA$%;FM^ZPpLqO9czf83hRtog{ zTFzRvdJA8`5$(&DdM9;~OHkeB9K>}S9TN%h7P7Wgo%8hy`$2xntimTSmoy*~dzYdJ z{r~Zt)hHE4yyXYuK0(lc>K1=0;#dEuJ%V?QTAY{%*=dcTpk@+i>zoUbtUt=o z$A^r@##9eor4jrM(G_jIZ7o#1{S`B1zdY!P4onrB+kbaBCl^6YFH<2G+ z_^Q=efMfV`y|_L}&RV@aZ{U&?U6OZRo}9G${z*N}^yVj(B`Z(rCIR6*PUN-tY=?~R z2=Tz4_@74>5M`T`UC^;4{Lv~TC{A;ggm;i#6Z%Q zb;vJ)=_BWvUn#|E{em&5(S`vFB@(KTZzx&V_TKpVi2%>sDeFQKzdrw5{iRF_0P0fM z)|&~)!)_D7)`;rkK*%yz*~%5egNSYO*XQXs(h}#osV58&`w+{mmY1s&vzJMxFg2}T zE#rygT&i~6D``HBOkKZplMWhDGhMXsdl;9)Tw{msgLq7T+wr4WId#tsy5sih343|C z-tS639;qnmr@L?+B$aZIk?9%4ZDatSeM~W7|(J1jE3(E|70RaWpOkv(dC;3 zL!JakRDeXUaT9x_P4kOdK{Un~%=wt%cPAJ9fz19DD+W?qkD0V&eQB@jsl0DE!gGgO zv>?Fy4b!C}Dt9K^?0%QbvL~ll7ZEo^-T_re*@y0dWK{6Y;tCFbPyp_-%C$Efn|6d) z@is}By|LWBnpgs{!@Jc#*lQFGKuZi6RB>_;W2kV60zT#kWWHISp!&xE_ScQwGnhc6z+4Z$~#od&=IzPOqu2#jiOJw9%vwcB# zs;~PVFu-gA`2PZ!3}^E>o28$5z!u1|>;J0V3=tBzEUuZCiUH)p$Vu_BZARW%er2@0 zTcm@i5{xW_LS9J0=kW%pa2(*>kST=SgRUq*kS5?`+x9)SZQHhO-(%ahZQHhO+veWc z$xL>VN%jpom2}cw)&2dz=(&tY?`2)A#^3FdL!Qi4-YUp?ZPWb3WI({*;n*uwv1tAD z0Z|1@l+TycxnT7Laqc5&Z!8js=K7XM7I!Xa>z=8_a|olW?UzNvUvn}>*NJK2@*OiR zJhUL$>O;(*kjmN~3 zkYyP_eE4r^gkYpUDf~j3Aak~bTR@hkxx=@ZifHV6ut}WD6RRq%eQ!~|G%my8oYZqQ z1dydEi$oqYhhN(l#rt*6?E@qOWh?4P8KK!N&kpi*f&|va*Cp#^8XWOc&eX z+`|3z3ex~lCij6A6;18ey!T~If(Rih;%Z-%8^X0N4?$ff=TDrAqW#-NyZMmAfv0Ft zFJitU3sUChCIfY)sr%&kU#upav`D*8W4FKEry!h?h zOnlr}TWDQ;NRC0|>8_C2H1EBpu(hV zqE^hx)Tyn{z3}j7sy@1G1D=DWyW@*p?`cyf+yk`Jo#SadaH?*qeiU0usjSL?> z(Q~v#oS^W&>IITZIcHn*p_q(vF*C@uQcDx85fWgp)_mD~x_~N@OU%!-wZZS8W1G^c z)I>V8_ru=B8QJ@aEo_G1MVQritB4~71|ajFw$#hBQ%Qy+ z_Fqsv;oj(Lbfq43xf#84vp(Ok2NJ_{5*^Z;lKj9e6fA-!bDUjw2q@IPehgxbS8ijo z4t{B1!QDr8rvn=Yy6j0KbEP6D!^VyMAcFjnoV6m3pd;;>AjT;Jf$@hRO~ldu9!KnS zMPDvl$MoJW=%2qg-7@ya-P55I08w;9=~h%(f}o}yh00wz!ojqtD#60#{FizHuf5O8 z>g9a|U&yi!*ACC;s9C;XB5~bK<%c0m7H!pg^)bf#E+#R1q&`WoaUq_-(c@EDYd zZlmjZh>K|-RBthUT8}w^GsO!8qp%sfXb z4;}L(=#*<#ISLmG>qX-uO{^HXgyWuWp};>%!w0j5Y6}SEhq(<3dQnwNP14IDEXKXD zTosl_P3jgfFRg6;u-T5XVQI_?Zo8lJDX#$oXInRW;=ZxcUZi^X+*z8X3)5u0L_MiK zu(=x63*_g;B(z&Q=}*#_nH-h4J!KEeiTfNH53Nvi)Gs76H*6mwvQr|jt|tO;{?+b^ zyH+H_%|%}2wUP5oRW?TTnT}G-+_5=(f;tkfol&;WT0PPZlxKDbA>raT@>P{pTB4Iu zFpP(+w5V1rBXk(^Pe_i$v_I)}b$T{23h+@0<&BgVlp^c~j<;R-o~5d=hCJzhwkj2k z1mo}AY66if2|sX0K}PrB^U~5LMfAz9?5Qy=Z`a|cn$;>;RAsHaK0(|1MN^JiF+j?Y zDx+9h!iNkN;MhgV3An3>HA#h5EJiCdg{SWCjL=D^)xvyrG49<3w@{^8INBol3f)UR z0lP9L9)wVDuf(;D8F@N=#FP;DmW`=Is1tiOFFTVXl&*~siZpR=IR43k1M0V8nx&@+ z;Vua|X0)u>KyNlzgHlwHv&9Ed%=T@Y4$jDSF#;_8TsmYyY=Vh%m&yw=^ohnpMi zGKF4lPb6EA4=RW96M_=V`hgc?O4sTAnN$-Y7B~Ec1~O||SuDHzL|LIYaM6C@dw>v& zA$vcDwu6_|;VLYxt}n$=v9iSeFQ5TN?%v$L$1`A!wbKV0;c|l?zGU=1$4Aa%kS6r_ zDe)QKqyn5i>}?bhmxvN)+X_NYa7rgA;`ZF|@RTrtNE$2|8Uo%?XJy4sEu<9kS*0-d zP7gVQuXZ!5*7t~Do8%$q%``cSDA=~R#?Axv;m40IN9moNGsK}E*%@Mc$i~i!pEu-c zpXr1w?Uc2|>2pVEzKnB2Lg}L|!C`xvvnSsBo|^W#E&k4A>cd zv!Vs4`2uga`SoRZ0-8Ve@imu#Uf(gu+Fm~DJzaO1I~#@CT(%26-f?*GwwDj^Rlf4&7yo07#kl^f$nINKSPmDv2Z0!2&qkPA~*AL9^$8HqgnEt z-d>+j+48gtgy6C(t?xlZM`B|M`S^4OM#Eb|ZzNS9)~qy5Z|OgibwQf6t%g97#J$-z zXUw3-a`9{jobL<2RRX6#g~x)PW_;R37L@DW``w*_PX9!pq5LUpk;-Zg&+)SQQ=ix8 z9@#0}J9R~kpXAnQWm(NZ`WxFX0}Uyu&Gd5aDjmf-#Zam%Agw#>6%^GF1cOdbwwdMx zZQ22oG5Ch5^l_4oJn}RNv(051^`rG8WWL8G!8b$fu)Rr=GiyABmhqUz~bT{Bn;*oj!M4YD*127@6vjT3< z9>QSdhHFdh=BgUNG9L$9xZ52ID^q8*dKZf$19}1v2Kew5pjkUgifsT2}98 z#*NtbDwqLo8>!Avk6(H~nb%~DcMtwY*WO;7ZmmjU7x3@4SMARTOF&fS5(mRf z8uISqN9VA=LM>~%$006Cv7w~QAN{7^kNG~A zWL{ql0=phK(D~PvVe2?BKhq}SI^GOe=D&pd`CB;p*=6$m9tXPvO+jx!?wXTvtf|P1 z3{%J_j2j(C2kF_eM6i>7<>*%79fbR>mp9e-VTnnB;5$ME&;k4usPjG*0Tt>DEje_v zr4Y5UUIszt8@KxREraC9Nd&3)*?}{N3}SjsPITi%p^ckINMaw3v*f}h-yUkL+v|C{ zf2(Qt>|dR9w>5D@Z<&+$fu;?HeA8I24QP@5Okd>KN9SPZL zp@M&tX9gyQ`$CyQxn_FJq%%(M8gW3IbhE$W3)hg;7^yS#pZJrl(Q?!~p_v0-cF|2_ z!)w#RtAlf6uHuTN4 zs*$Kj&v_B@4kP&`==kMSGQen20pN(~C0+orJQVEgE;p0+N8p!XmCpr*VAjB z3M-;6UQ9>#!+C;hF`t$v(`Y%(b9hVEgZCsfG72Y7E`}nghL!a$iX|rRh+Yy<6p$qGI;A#nzU`=}spzQf zu&S1kttyhFv%b)`Cf(PEFETULKL8|GU&rk1C}UrvV7H%~uT0ZulLU^o2J~fcWp{K` zFk>RlOAhQ#L!65O&oeNELSSM7{2wY@&VQ(I`~b-v5nwDdG~2$KKMsHxe}BLq*cOH- z2JrarUqds~|EX}<={$FI!~aycigZi>a|^fFiJ`b2`X`*G7{7!zy#A5(;44P zc}JF(W=6mK}{g;C;H(I_N%#y#sSo!)LassllPC zd;BoCJ@XT5v*Uw@SGNCT;f&$G{(|#^`z3dWS680%fqpe-a(z`2h?#}<;<@_P_ZmyW z(ek4sn^B1o?AfXQVF>qKg=}I5`bpdzzMzA#r~kdQxX?fNkdyiy_*wW8@fTHnp#{iG z2fxeJ9x(+_qCywbBA)GS|4rcF)cUT3QA4Nt8~I!12e)T!YH(z2X?1e&ka|M*%Gdgs z>kahNdJ~OPU&IyXGEk_8x(erzX;y!T%!+*IU$sc^1JYNNk>TT@xT zE&|HGQ!vlFL{ZYXS2jF=C8j6#QBZJwy%d1TziyOFU$5a`y9D>Xk$t~34?n%(pL#4G zyLk7%mw$h1myl{&TA)N-eZlv3|AO7Q&10+s|J-2t;q2v_7+D>`yqWE*r+@hhMqgD~ z^Zd&7|1N6{UhS&<%FX;j{c;7@br0(WpQW#3uKn7yIL6mK&@-tt0R8J6OhsG&>hAPj zUA&Z-&a|k$nEHzRtbYH%8XA7krDYT+hev<&S=RkxGd8k)*YbQVU+dx0TUuIBP+Bbh z;I~}&W+nf~g33=X&codCF;eKid`IL!>;P3$KJWb(j0eGOv7I#PAUO5~a>)wBU zi@wnjAANI`*v@C-@Z;IZhPm#HZ$4Newf56_=*26_7=YO!up!59cmawb;n$_q^sYm}toP-95E8m>**zV>uiQ z*bK+>bB@@#r4n-Mk`Kf8kB9U1pv~s+!5N#wiFq+xS9~eT&_Uh%Oi+A9EwEK^wqL*l zW4K5qG|jRaa@V7qxaK!^qW9+e;wi5x(EETBq2KPmfN}bk#^t|I#qbk&ISM;6OIX2( zT@Qai2C42jyUIEk9e+eV-dh{Hlb@wA-UY<7vE`=bs6}kio4|BnoLiiG&mTWRewdD4 zMBTxi$L2X4OlF?TA=wsa>bLqy{^M6sc*X0ksYWtgY%%>nmbm(S7g$WrM?rwY_r#O9 zNG4y9!#qQBbp!S@aN}@>TyIc3ak?Q{ z%`jWiB#;1F_gP{{rTusaADy_Izzmd~Lz{jRSxR}8d~;RVkWMz;{ecX!!rmHu@>{rK zNz6ys1}X$~nKcM!nu_7}I_cuDof&ljdaRvU@&3X~Iquv=F-+ zzIt>;wTxf8mS$SvE5wJ8Mn>OzbbKYA_~ei)K|T;rUU)D>t0h=DTMA}>M$>eyFT>&g@dQ`S5$lv z>Wt7EvomWpe>8*7DZxYFpxE(BiddX>adnHY3q!@+ zC7dj@_G}(YWlfKjg(z8krV8qd2kVKnTx#58Erg@UZ^AuQPqWBGX%r6?K><%w<+}#m z#-YGcR5+Df%9>K!80;XzV^-}Z=D@U4zc_%Fn7NA;DE+3z7em8BzO3o84sqnZM&PMu znIc)J$SmYZXO3-wob#ho9?xH)wSgpbWu zdp?+`+tIUAfv4yq% zvB?@yoq;({)nXZ(M!;m}BSu=YXxJS^YHaDKAa^aJ0Ag$WgF-S#efaqmdm>*D?5`eO zt~S$ai1TpNgsY6$kW(&pOfwVmxK3~?aN9>9)~8hgy4P<2xt8`A_e##7f0+#ccf{jOt_Cc4)-oc*j=t@<+qDTWqgLP&6R|FV_fqliGFAz&VH6P z?U~_QhI=TBmRFzv7J;ENgI-hHM54gHjJK6eb+OT6yU>;}Dl8_64CmCxcL(%*w$NNc zA2f9|on9!PT*Uz%8%%&wO_%1p0X12vjiw~YT@1Sy`!Un{)6kqM?}|w34_%oP_!ST` zgPF=%x6arCBh3%xv_W&{HA`GYEid`G2Ku7IqS)Yi7#jLWSLHe=cwebbR9BZq;3p-f zDr&1g!>frR5La?@vEI%q6ZGxMZODA#$vx+)K0UNF9qUhr*`-Nx*JHA6A3DC>?adI~ zLNmVlcH|EwiK&pt8KNb$iMjJEA`fu6uwv42w_AB@-qvIflN01_P5PGHTY;rPm6FIYs8A z@|A;Yml_s#*@pBzA(=P2%si7=3nq8cYOX0rI|mC&&R&1XIQbk&L)1;Qg!$6D2;yi^ zgk`)z-um?!s($L16~_jk4@SXl{=A73j6s4)mC^h|galx=Y__Q|4%YLA31_p4H|1kk z)gWum&jdHI^B3YN|o<@C;@yEf3z>!RH%v%$Tm0LADa$=xA~3}ZTR zq?8d`X(f>pEBokqdtbQ16T*CDG4C^Tc3wnk1e;u)^X%20p-rSuT=B2=sHliYRT5)DvNXiHKpC^iF4N9&`8$ zM$*Wm&54ycg^PAKgV!P5O>A>8$v4lr3aSi@)Pnsmf<%Y8=z7LoAjj0Gww*a^nZ~{G zjWJpH5l}l&1>(fD{uIqf)NMzZ2JxOCA_V zsACqtGm#_IZI&*W^5iV-Os*lk^q6=&ucD>!+{RFwzMSaNQBvYmI1+1!LG|wuE>r zpkcyN%qidK#i#V<>PMS`4z#}A#`O@sr%36o{=8$mDPJXH`xVy~Gy0uoHB`QKTzNa( zI#@P$3=P@j<_-=|JGiN~;Yj&2LeD`1EHNcy)s)m>pR=Nn&F51}VjXU2O$EN&sBT<{ zoy|sN*RWCZyu&&RX zVJ2nO+!e^^lXrhq0B|{oaKH?R&VYN22%hQ_g@b*$q-R+-&I@-MN0z|}sDI^erI7;yKu8VH6D zy9)Im6nf?1I@lXTqmQsA`IM40NC7s!7!$@CHP}m521H4CJci$MzK^LRQ}d;q1?CBV zTne#b#k6ca3pG>jmgf~ff*}V(4d(xxK+@IuIZcr<0+ekY?!xEWSBpmU5VO0(KFzRz zv*q?p;woQvKs)Qjc22`%9qP5GKLS1uYICMG=p3i!2Q*Q1J+6xc{6JEk={YSt(^3(O zfY_-rs=+AK)sjYTbykW+n&J&Q%D(4Vu7&cyx_F1gfPE+S>=5N?4f1(MV&ns&O;)+M zRgX46hfH~*ZOD@;hHBD}8;RNiO?+2dZV(E)DIt1FO#k0`(s zXP}}_;H!_*weDtLgt(#BqWsDCG|cl2iz>Blq@wjoY?tOQOWpbBoaXT4_T_-xklDH6 ztg#v$cG4iya2nssV?B1Ipy&k*J+;B2;QG|eLn*ahlmS2N}@;_G}*p8=C`fi z5N!EGSbI{=C*-E`PJzFtnpB>k*y4q{p=RE|NLku|RR+8Fr|Vx{;Fh0TVrg=oe(j$+x(-OcK^evyR)Kdh1M|2nCj7K z`xsqJ?ZAyI%WJ*%(YOTzD&2&*YaJX*pt?}6KpVTrWGqinr$#KTGs230&Qyc!b*BDS z2`S7bx-1Ugum$V4x!L`6ohP6qE;veXh@Se2wD*ZvxRC`+rZSU7;CE_F1eIYDJT}Cw z%l#73+6-khZw(|dpQe5V@F;D=c0t;tFCPLXtTSL(a#M`)SNDMSgi@eeUm9cvU*+L5 z-|#pSUCDW39$eb{YJjPehDl)Tph_t>$abP;W=jd$odq8@dagMPl)mplZ1X}LG0Lu~wdJBSyGHl)t4#Vk-(uZT>D00g|3hZI5us>Z&HCHVtE#NCi6Wrs(L<+l_W_YsDC2 z^&jgbcnP&Ie&Og%2q9U?KQ@%5EOzu}s?JNo&j&^6Z84--)~y&YZsF9awl!^wc^8I0?#MH>%>D@Z&(;zIUa#qwzjWrwTMqReq3b0G?m(Sjbn_ff`;8E4C72rH{ z_ge*LV%L~B(Er(}qsJQX%>u8Gdz18JOWQ9Oy#ls7gj{L5vDJ$Yn5Dn|Hii9FdsU?= z4f2o)rXIk%=^})3caQBynr%|R-g4!(hs{{#Ehz>0Z@{-NIW&EzqHXQ1F$vH#l)rUyC9Jds#g7Q3)`bfqr$03XQYV zUc|)|AOglKCGi}AE86ggxH$xa2ePaqH3wVAjh^N607gLQlmWrZ((K2?hB z_*Bv9)~F{u@3%g+1jIzri~0Ajy1|4Pmz9k(qucfnk37a8s!wk4{TviZ!qiV~49uhm zS+kl-@+hMRwyoHI#N%bkSQl{md)ntZV3+*;SoFKS@{@{me~VS-%IyMzu1`&RLf-G% z8?re`3?I3q>A|X4%V&XGNcys~;WQ)Lpi_WhAcW9!>kBr8rE+pUKsEus`&@huPPiBB zdA8pm*CR{z<{f?A0&snyOaqSyAaQeovI}G({lMQ%KUi{l-c!HwTGzQh_F3Z_r}T*#<7nS2Z7oXsQKtxUJaKAdmyabQ(|KRyS5k!K zlW{l#-Za{;?i(J22QBIW!~)+BBhNeK2<};FexuNV7QTV(BO9+SdmR#OCDv14e*#_q z>7&NyTH*htpHJXydmF1^On{}7Y#E_dK49U6! zk!7wUph#3K$1+7?WqE(&f{3O4SuikD%b9>-sz&XqmS7N|YnITj8Dvo+a(MX(ecUENc z4XRxC3u;5+;I0iNG%74ibhy~W%L`Z8@>Ov4=)9aGLjVK*xtXA0JG=gZEe#N+hLFHc zES?55%1ZQIU9se;e@?ybR{VBT{Dh$wrw)H}} zmlHZr7~vw&E)oUKAu}Wlo|OvNi-mDh^zY5cIdr$u(;D11j?85-ht{^OQLppJ_3Mz7 zcY$tz2nSF4DHWJ!Q>O2Mu5Exl{yWhRnNm3CBZlgE6SP?fDB>YA!?O=eUcOovy~H1yHbi>{@L?Cgm4N zb}_40k-ltg43mJ_iJ4?}HSkmQD-iY1*aOT#D^{(OhiasNjHxrE zZ_cvka|bg)YZiU=Wtd|f8-(SjxzHK1D20bctzjmmT90(0VC8m`N8$VpE%qQcHtWow zoTkX*f!$qgtmJZ`)iwCwWV`2U^t&bXMbyGfl{@)Yb^ClPNee65lL*8ceRR>xfZY5E z2N}pN?2b9-Oj}V@md~|gFRlh_q@@?Pr9{n&k0#$=xA`K~ZJ08RiqNfFrH^V)TW^ht zU0F2&Wts-?Z*k0E9ETPd=>?W1A=4)cx`si(?xlw@inw7t4M(#noL9lP*;|8Mq&1N z)^|Km*?tm*oaTr(6Mm?rV!Z}5a08kPu^VF8B6;gZGg4ys*u<5Ha_68cd`Wk82f}-? zd-yjI)MWj&fN@XN@ldUitp`vW*}CjglQ%CILW3z1818N^2=-2 z?MUsU7~HX+&((!*7sjA2mJL;A$U?};OJ&HsNdJ|3V3#Fpy2u=WG>qDpSI}EPNVp3fUA;h<`R4;=y865d}ehVG_bnCa!C%8GEe#bqS z9!_~SJ%<{P7`m|lcrt6a?Q8C zAo`hL4)a9()lB{S#8_Hs61lwbGk(p2t>y7@@lJzjhU6TV&b$^kI#CQ=1Glinol%6X zFKzP50}l^r8U8_C-T_MOwqI+KSoV$MaPe{AkwZ&A6`6%Q1ir&p=52)(smQ=&s+{l? zq6e(z9kFWH%#CZjNmH02Y2A!;>dRJjV;ipAB##@dSpW0b?ZFm`y6VJ= zPnQH+%cG?JD6vxrpU-6(&a~C4BA!Z5cIJ(BDFWzk#?cR~&nS`2SsXPTKy9EL0RkqZ^wiU^%6Ov-CHAue z&tO)j>SP?-Bho`^FAhVuE3;*B!vHkpj#qC}g(%g*6?YpZ&Tq%x4f4-hi&f;01u{zu5}A{HZ{RXiif1Zn3`=hoSOJR5Xq?lGrh)w7DF z%ND$+j@;8v*fG5&NRxE2(LQ=mf3FW1i(xpj6f}LwIIa9&UwBy4$yu*|XKD&XY)Y(G zpr(6?a|3QaBxc+d!>_rA=oiy-Ks^+sBL-=tT+(DiNoj@zn;`B#bekA<;-khB&fnkD zeYU{Ax@F*CQRW~$^u^u*`Y0B5tn(-X<03E(%3!ZDD?HR4^40h~odC1RZ!*vlaX{v% z!6N63(ZSXM+`ld!YIK(6!&>5-r>70xhdMFF9!?)i1jB^Gggn5ysp5nA)uL|6JfkBN zPLl!f*h~Aj@4ADl_$3wwF+F;V-IlH;P59zjOu9&`qs~CBP;0$5Hf!fO*xH2`qrEjS^{*GP@Wkn@t2i;07?r*JC9krmafg=Xk+QCdV`Xp60QOr z!&^v;7S-h9CIA_P2FB&xZ>J|@AQhC?xEy}o;QH@bYgL@d1Bz?;@e2b^(RU|Yub}b_ zt8~nv0&2ybL=z;z;~zFDvDUVc$7dsX<^DTg0uKciJ>RrV4iVvGm*h5{V>eBCK^&J3 znL4S|_Kmb&EUwFtoKBPj;`Ed&^%X)U$-1o2$s#mm!5p(MW^8lH-~-btN_O^9_Ny(* zjB+ZZTc>6$3h)4}F(D#NE9n6%yrP-fyaLVrE>mAA4 zdoLIYziqNRs9GMnEFpJ$4^iRu3;vzu8oi&*oS)#T(q`)YtX_s=yr@-M&z#U5E0rTs zn2O5{_9A!ew@a~X!1mfy2aAt@;l2Jn|F!I5i~4a4c8*=!Abj>6;72o20aJGd1*T4S z#tcYPYQ?C`(k7~6_~K{C6K_V*gT!;@#BRL>0l+J4jVUHXj+D| zVW4aIbvtLwH8$}CYc3ZRb8L;ivll1~q$9YCEzslg@m9ls15mbhI3D8pdf*(IZJ`dd z_$rUIiPNTZ$FUbdFU|L^9pyvq-%4I--~hHJ&FmuB#peAe*(82`( zv^}-#`|&vr#mRV%eFQY>%Ceyn3EhnYNTdFV;5LL+=PvvU|AxPKU?h}9_NhjkX3DVJzY4nPm z^;cvgY@7UQX7S684!8eI2sD}!dqFbsa zr>mxekR;|cn-bOZxDMR#PDbh2#d%<|_WPbBCDL!-UY)m_$&f8he#VL%JdRFSYap%8ol_qvnXG5~<0yQ(J0=)v zN|dS91X&$o(&R-^x4z73087|J=V(zP_dRvIx%{R@pBetyFQC_`mX%T4nSNWE$w}i% z&D$RM4HSd)T`W|`fKb>3_t(d{8geA7%$vHEz*w|VE^fm#nNAIXo;i?PLJ778co>2v z?3QK7Qry-&Ws~F!h@Gml{cdMUmT?;ibUI26$&_iL9mI!*=~!crZ}hLdDk|)sOSy}rHb~ncp3iFnQ{db^QO9$NGBkSH5OK%reNH9oo{-o zLCg{Qn9(2d;t-JWS`i}oOhc?H;YLcreZVlJyah{DJn(z_c`- zO)YG&s{v<==$fpQqmMxn^wo@<;<(4hvZ!Z}cj0Q`V-3>U1CKBjFH?V$yHASas2F(i zjypFG#IAmHtE-!%ElUgr#&9X-(n^_=kq~FmoU8l=J7^?)8wX#BpD$stkb}A-CYv*Q zI2qUu`$7h_nb%F=re3`L>CuoaH07h1r}vtkTj47!*f#ztz*xl#&BB?w?tafhO2S0k z)+C}ju!@DTAbBpT>c}3i1=iZql?J7K&zy@Cin%F>@Qf1_DO7(owpkJ`d#B^Vl@Zo4 zR+l2lvE9Y~WHgFolB#U?&PM!OJ_RBnSt3a~nvg~yOcxKW_}I>n#(%R|T!4$gKVg|U zVlgYkw3|zMCn7L-_;G9`H44!Y`U7(_djK2QhB{pxo7}y(pY2gV5jr0zkBmc|#c#)z5!Gp_Me%1z| zN#a0w6$_in5K#0Z?XvUqr1&NS1Lfl9(>mJ1sc{j$G`0Lb$#GWu9ruw)L?7W+J}jK(WBnKpXci2XaW3om zo$K2c0(6AZAI}k=r?U0Qj<+F-6wZr_#yeU#A}pwZFh9C+r_Z%Y>d&`u6G*-wJZ*YX ze7cdi{yZJ_6k;OmV>}o(&Ti0|T_)g1@p6gzZlsJ8Z*FqTBKR&Ld&1&=U{h0TsFqW~ z_udn=!W6oE^-y!G z9vOEOnv5ch_edPvtYGvmhS_lZEZy*lG(z;Ff@;=N~;yb_WosDFeXW+R|Fno2F`;$tI`tv zQb(jbm@!i%kmeVxX(M#VH{`|c?UceHcRD)}G2>9x_c*SZkXAZh9@Q+~(nlMH4m7_>ZFRQ)#57t25TRwA zk_(<$XL%!ZQAOS0FrOZZp!3pU))a2s47;XwmdLFzuoSP7rVy7Tz}RbRjND2jW+elz z7+8@qy4;X}o1S{mq~9X0AaX!kfj&!R0sd@d=Sgn9;x*ZxyVB9>?0&K?IS+jOi22|} z-H*ssv!}u(8ac`Hieg~*E15QmnsE2nOa%y+W+D^e z2wYbzU?HuQ9_jr z!@ow31gm9K`hzavrtRd?4lH_4`8Rm21_cm2g$E9Wcjq1}enKv2J_IvZs{`Jj4-}5K0@kMVPRNA3rEQh6gU2XRCm=1?a5v5XDD#gCjy=`^s!+yTn|a zf~z|Q{t;e9wz&Xfz|0FjG7Uo zLRHW_Qp4I_UqxxO8v#jVf$D^dJK)L=m^qpOjGyAhVtEzt`(5Mo}JciW0{xNg4f`+H__ZdKf$Qd%&=x zxyzN@MG$ad_|UBrQtXP+z{Ja@mNMSHv=@1(!A1PbJSI_wx+C-eJ3i%$bgT#u z&A+-H)_mC!S%;IRTPL}^aJ|b)uP9lAso&a?*Ff3F0!>zcTTo>;7Cxa6%XAq0L@AI| z7fdW{0Oox&YKXdli5#2f>TuLeZCmC8+I5&0#%%TK^#7Kc7Kyvg(5vbVJBQZ94b-rexSoGPQwF} zIaU>y&>K|uH0H=5PHnqHRplqtb1{#cd}V~s092qc6HPbG$dEH>9$f%{%tYSS^t?|c=-dBs5Ic?pPUwws{9G?C5H)|rpj0Wmt$cR` z)k*+$k8j4oOi#KDwVjzMB|xCch_v}W0_&rE-d-_<#%AIL6(~XXRoa!gi=+}pd?MOb z^dA(Z=boW|?LXCgf&651EV5(YT<5t%a(Spe;%0(Cus`+}5JWrEV22lm`6jY99W_Cz zoD9bM;61ewVkW0VQE&z54x7EjQ(4@;^EdWuK|_9PxQbnJ(M?+`jhV(WBfcM>qExlT z3=KPDV*7R>F?N~1LZ;W`XP~DNvj`MLC1z+u>$N{cmP}>+-Xvj(lzDNa2B#whTM2w3 z3a&nek@PsLwWU+5GUR*glb=RfGsj8vXT5U&AO~SYJPdpPC zGI(N1eY%UN5L4#>n2^DW{3Fs#u4o`Zf|B;T500xdhUa2S`Pbu}K4OGr(cI+?GCJNF z@7qC<2$wF{{r%na=@7&cT+`E_H3RTmwmer9-Z#NZIsEKY8~kxU3fRgQGh ztRa=jIuA=ahlu{Xra^&L1tM2+JK~;uOS7YDE+mKz5>;N9)%gJ9RyQ4WWQfq9O=t7~ zxiE^#JE(#)#XfpQ+-iP9IL(eDX=+4jqeU!mTw(A`f#8kTGhq{Dr(P(eL0Heq6I*)B zJju{@Np^_yke}Z#n};DvMK@zgC`@*%@O5H{IUn+Gwk~-h!4w%xj+pT}DQBT1L+i}_ zj`h@lV&)mbDST&$$sH|wU|b2l`UNV^vR8p^IWoOj@IsiR=QA{440kpac?SgF__BOa zdBrk^3RZFh{F!gRq6-`P)xHyaCoLmo=N&{c0^mz}W(E6eI&Mlx1fY^{JZIEUJ6c3H z^3YJ`P*{~~P2XBlDKqlstqN+oR|FDN&v_d-Ez!G0@h7)Vv?vb-Lp64Fug~GywiSiz z6N5l*{z20XdmFcqBN6%O6SXS$4>ZbY3m)MhmJsBUJ%dab?ao41^J7D%e#^R5it8m7 zTl#aQA!Uoug;?smTMSu7D6}ctkx-D8E#vN-xZqhI7;|}DAYr}Y z7M$xEY`*RT#`{|%d;u#Ag zBqU~0&X^}rC!H`fpZ7$Ju9jKxdC_*0HbTr^Jr;^IE!psdA@S!)h6jb-+yHewH}}sT zp#j@YmbBp|Mqrq3q{Og$Nt;Tuiv*cuJ%v9-jdk+U{x z7>3Bq+M#f*xz0XHrBVC)U|D45^ZjHuc9jlR%|?wn90cF5Qu?%EBq1GqU(u^rCo-AxvbiB%Jshi!|m+Czj9zIqi&XUcCgHj8Yj7d!dHL9laCBlylm|^>pURhQO6(@=BQl@ z>h?FUm;O?T_0Dv#bMwfZ&4CMq%q;DmRyr{1EkyTU_Up+STnhB%S##MTnfALaXttYf zl3po#Fy}r-Vvm)-;HIn$EgbQEW$h`ym1Gf$EEBUFc3$b~G_Z8JnoN(;b|#Br9RP`} zJ1FAPl`Po@gZ-bzzB(w*r^_05w?MD~hTse{xVyUrhadwC?hZkML(suBXmA2Sf&~w5 zf#B{MTtk-MzPnpn^=;MrRdrYOz0d8wx4QbT^VB&v%&n+(<|0W(-`?md*0AMf?xPF# zyxzINr1Dl&Qq46TajAwVHmU$-IG^ukYD!^hT$~cC);C^`V}*HnV0J6`r>g+l89&S2 zPd}LsS(HsSBl33drxg80&)=lTJJq=FU0h73daHGGx5c_aHKM7<$1ee0P+X$?2ml%Pj6kV3y~ z5I)CCp;@A$052yiFHuc7ENhACg0{p>1-(*Qzr*Eh9$D-BWaE$U6FK<4d-QVAzq@uQ zn9gT`!2*eC(*<7`P5m(oI6k^}$8I#O_;f%$R(;jzU-F@ZVR;X5`Dxk6DV`6(W2(!txfPqsiLpN@TcHI zDg}N~asEA6uZ2fDS!t*`v#UBfNLfshez3;e;Q(EQEQ%Am{+V^KR~{~5VR0u;FKr7* zSv54O5Rua*zbz8nJ7skoBQfC@>$K%LXMozV*6-rm(4zBW!XZT4KAI6txm|BFRQ+vT zHy@4fCmvSZC+de|#9KND`OnB2!o?HNOFD!{hMTYw_GDs)@Kz*R0w^@F7={PPES+zi zlJ|4*v{n`W`G4{*9Gn*UJr`yxK`LuSg!WF&bhvX*V$(W!{ zQyRR7VG?omC+D4Z>|FaZ7HxnNYeXzn)e}n()(!V56zk_ zA-D7x=>r;gc2n_=#WAUzUZAm|w z$g{x{lhDN~P=8;Zc4C^;xm;p+7L^1A$WyJ$Z5pXL)k0^lE=`4VIt3P=X&?MACLgG*%+psp%P|lV zmET@uIXi0pXb9uP!T|LW3LJbve@ptLyhIyNURM64W<=nTZYe2!pS)}BLtz~_GCmPd zVL-C{t5~5^xLJT?m=9LVtdy#f0y6b^Qe2g+y?i@kA2Af6z0cF;ET$Vd7{xjKXbt9( zK7K{w)U++~jN8bAo#$2`RAOVKxsi-O)k%-Z63u$0*;kyrdBrJH1K&I;!C5eId8kjx zDTgYtd9I2M>9Kt@yJ~RM%FtQp+aFG#H^wAMm$5!)Pg7LoL21uJgdd zLBG<>v70E(M0EA5G3b)wnIj?Oi)J77I0TA~q*jm-EvhDB`_>7_C)_WP*q2Wv4S}7L zqPU;;M*GV55*v9@-#ra&JjRN6K4|fHMGZR-ZW%n-B=(t0B;yZUozeKk)VN>(i>|8P z$T$0qD3>1BsM)MW9} zBQ14Cb6Zcg4M;d_#U)#D3rtCMlD=y-@3+LbFss1{XI(a`E7pc_U^j}mf8%G>A-pZT zLQa72k4}P69Ft0nY&lhog-%=byfAr|fm~Vafs68fjE8J4cV(OE2B0YcM@ycc$=6EN z6c3B@7)-{F(l~V(WmV>ldCwR^5{EKvTcrHsr&8?==FH$4tZv-ksbM3l>Fj4%fYZDc zEpJ(fe#I`KV8{rfWw=c91G>{A)-(JbEU2dB2hiZQA;vT1%5 zO2mfPCGS#oz7xlOby;1-s=>c6d1)NF_0nf5r@3l>P)4QlS;{PN|+{of|c*-6IS0}5c4 z5rS|*__+AEz+4b+K3*^f7e5mh7t>3es+(+g|;C8I6O9q=;#RTDelE!55ZB{hJX6U+nV6@>8dazHrw{=3%ytPr3A^MV2( zTwnnffW3>khpju*9N_g|`}jDyIk{M{#Kiu&4rdEHEb#v(KkN9qKmj0i3p;HOM=X#U zK#=PnR@GEIb3$m`Z5h>F+ zG+7`zWk^7AEX;!YqZf39ZDe8e`QfA%F&V%(oV>LtieE+)0>CJkGBcaR9frv2?$hgp zr-mn2Bz~IgA*o=kx(UY#pV2LpqGR>=9Zn$i%8*nF)yUQW||Aj3mNV=mhIEU9M($;k{?cO?gF5O8AtF`aw^Il)bW^yf*6L z9*k9ei!0m(RTbtSdqjF=cGNT6BSddUI#+XRTaGQWmer%zXkm}-3^SP{UDfqCJ2(t9 zNA3@kl&YM?Cx^4+vq{9SL61kYD>uMd*xRJ6Nsu!&LMYvIKc_f4r z%6LM5PwKy(Er#e*&hnsycv*%m5Qm;Rg!5v&HivJAYmKG6!?Ai(!Ukk*q7N)k1I9}j zN|LHeC84?XPnRbQ8j>X4YDI{K#DpS5*ZunF1WRouh06>G)0dL`M0}C}Ar-1Y$O^H3 zM#`Z^Cr6>lQV|f*+Zvsi!@CK-y<=;MQOaWSF(j{k`$59+Md@y{(b}#O_!+xi6K2Rr zG9e&R@)wUPDQ#p}&-yIg>}L4(z3Hs%y|tU^89ZS(edI-*(?tJE>{iD`OK091yV{XG zgviN9H(!+r{gSqSuOfI{QH%3_kOtRmQXo;Hx$Bvf`xVcML#K~7uVD2M>ptQS_Vnw` zWQTBP{P*nnoknVDo^&ndwEV z@>i8$klX}c8O=8mWp)UdwTje~xU0dHspCC4r1Pt;ARj?9nv|gTJxw28tnii~nng{Y zV9a)*PGujN6T`K6WYPo1U6?+TcU4w>qb&0+clnWB)VGVju0P$aAoId-dIXZEi;9GO zAlI8>6^LlD(e}gsE)hB0iY>G4Q;l9u%~RJV7erz3_v@KaW3Ej5eHKs7L&9uWxHsiD z6HStx+52CW{rBmc?y-{hEze@2)d~4DPnr&?5k^T7_s&X|{3YXs_Na9ftrK&4k7*Ww zdi7~{KeLeLz!+d_Zs<(lY@@yMNqzX{7rV7Gwfo@tA)PcKSnUm?q}{FO8H=pcBj?=T z`A3JGg3O#o+oFOc%)D-8!^CUE37*4op{&7J2}acDN0JubxWWRrd}LWk)eH%L`LK3^ zN2>7Qz}DwawnW)Vl_Ckx3y^$n4K5m^wk+N}GRopN5lHnauCGI6IJ$}7iE*`!lXNS@ z75Rrs2}^8c(#D+c57@6On^(UR!fRj|Js@B)Kp+Q(S(DSF9{3p|epRSa)tGOe2x&sd zA)>#)@=zhQJ#0TNvi=ZRr^p~>m0T6Zu<4W)%<^=D^oEvar9-}#!b<}4wTf&A^p zM|D5xN5{A5d?R(fiB~k6v8pwppZX!T07~T+5b?Xk`Z&?e&`&#zk0bg~sVw0=hDZ*J z1h`r-i0sb|x}0v2H2QBEu<`_ceN0K+dbt(0J5yH*%y*e1wrma}?HEa`x37;kV4pB!mRTA7MT255@RJelD zuGCo2OiJ#^Bf{}SnJQD)X5p@JyoMv(fZ!NW%W(F}=SchaU|#cAfv}5q29#Ed`9C8S zIj67I!02`vDdomur^Ew=31Pm%=;2?~zN86k_6h43Tj$|A-u|RmEVF{!=E2`SDvhUQxH^#^3jR zfx$$PwsJyVHs2=%W>CDSya(QnWNSKL!rpHsIiAf+H$>R?GLC@WACk6(x6~KPuv1O4 zrOm6#u-3m>OQqp!G~9II{TroZf5RT&8WNv267W+WaJ0buR+)~PEQvEO*Pb=nKcH$y zA;|Jz;o4EV^ci-VCbzrTp+$v#sk(@Q3*zO&BnD-lveFPR6bi`Zcvg{QwY?#E*yc0t z$(@yi>RuA*s~!F&mu5&BZAzt0uzpYW(5rj>-3?Kq9JR2klI7QjfzTDnU+9rct!$ z4}ZMOaOl?gae0z%cuSdE^07!|;nC<@W@=I4BRkS&CfOKHYFRa3Bq4}iiDI< zc1wI~xci2Vb!^;E<8`V9eLk(U(ybF2xg?3U zrS_xU^o71s(khiahJz6~)L)w-_0+91u-u%d;f8QW8@0QmW$p%Aes!2k*sy0efEVaj z6>9!v|3wro1KRb*M97T3zn-*gfIfH2=i|;jD#Tfw zY8tKI6|;=rM`gMh{35O+<|d>@1pSUE++*JxqsH-i2|~}-t0Y$g{}wfC|2fR5kuEZdML3%>-(`WETxndmYNyPVBaf6894JydnNwEf2gz6uTgMkJm1Rg|m^F6Rcn{w@VVM$|fe-2;@BlAsWcOvmbkKS&E6AOh%qY+zd*HQe#~H;0CmxTg)~3B7d3O9IHYwaWqw6T#)68o zw1bX|o{!q_);j_2hc(@>!h|nTRHf_jY|n#q>3u4cPkmdM4DJlM*z1-k3rbSa8}Z-y z1X*wzp7^q}q8simJI=6&?`h6QDUYQtba zETZ~l^L?trQ1+W|`{dMf5DcF$!1$^>#RMaN2z-S~k)(7@_(p?@f_1J6n0O4E24?cv zTs#ZJN4YFlrv?OMr;k-F)d!iDaHXSr1kGX^Cg(h@S%GSNF>Z-t4*C^=`DB z3tZ1eG!yn_=MYdC{us8aJiNA23&QzGKg|(P)o1M<$NnpEGqc4MNK#O$}}g zIoWKJ$BU3`O3*8G06u+g>BG}L=bpxPlFYZ;HoG*=;#tfHk~p5(9*d;ijFo@|Z=V%7 zI_I8<)EtVr(8o|?gQ$L$s)b7ReW%@_#NW85a73)Hy)+SLp(qZ>BQLf|;WNIJVxEGL zk)4EaRCMf~oMhCVK2XYJuGKTaEv|tEucD zVhaNcp;R5)7Fh+&7MTY%j9LwWC*EA5!T-vBV11@{MmJD|c!J{$S%h*YN%03qo}&f9 zo%Dn`GOn0nOskF%Wx-vwf-R%svK_KiGixGUy!JUVe57FRjR1=Z% zZM=?8;9Z1ua*TRV0TYgeqQKX|8@e z8}nrvn8@ffU0e5fk1Oguzf}zFF=1RdterhUKf=+fnl}my;#7nmJKFkJZ=*FusvliV zw=CZU;7lP>GiG^4+m2CIov?kh11O|8AbKx0{hX- z9DI$<@;OWOM(*i@rgm)IB-O>Jf*yQ+pMw%isdJ)YXhz@c{R)5ieSg=+haa_zjA4Kg zpu8~Ix6^y19k3PAbI@@ywS8zHD*Csn&-}Y7CdB7PVtwOs$BIuh(8pJ-5wnGG2VEzXm~ifc;`psOtv4<*1zrGCzKhO znRn}h+xGk6C>Gy&O^n{uOq6y@cL>;`^k{@q#)o-|$j)+cw9VXwKO(XNGw7z3HxA-_1DtK}YsyLG4ICf2lod6Yi@iA8sp{8i+ju&1ZAf7Jp0CxG!EBVrs`7mL?ggDGRgBiuWb6 zk>8$%da)R#4|P^IFo(550uS+<=vh?#QC8UwyOZ z8I?1-y}G195tVcGOI*V<7I}qLe_gpV;bvuP ziYI&g*wYW#)Au6>P?PZk_gP1>1vSKZpR~#aT#A7!`PQeV@*}tV3BhpC--=h4R8w^+ zYysy_`v*f{g0BpA(+I4g-(E>fIigHPX-490xtYAL1!W$Qs(D|;fmZVZd|WZq`y zV)s(ZWP#4?8Tm$$p55&Wk=ytcM-Tgy%F6yH`M%8&E6urv2c*}*D_l*cDj-D)PABV; zgW2PW#=v)q*Pp}~jyX#khUn2%bcB7oY|tn0^E;q@a?7-+=#pEtI_La7tEQ zw$=v5lz+9o(>;`((nX~T>RdMN$};N=a52tbi(_V*)(O`;BJDKK5PS!7Ta9xSbXMs2 zwYTkSO7A#MFj1vI1U;&W&^Fqo6?7k|%^x3de#TS$4 z>l!m`56GcBa~R8QWn~6i8uvQI>CEUhalva=<)U=YdA~e5lzmC8_UN-^Rw_z3v?lH< zqxW11ipgExT*6PtdwO1at%=ZFU!LBM5yS&Pd1{4^7jFcvjX%ACCH9`+wfS8n2Kvf0 zhJ61raiF$({`(|$OML=8$B9dTIrl1ldMHQrm(5I6j;i@!=;KprnCP@zu79_ow@&Aq zG5@7QnvZd6%)-wfwvd!Q4-m8O?>Piz+QZ^NMKyEj((v5ssl~3Zew3GWCaL@tXA9{R z-VRO{YoueH83VIk-Hz@*reuRN2WrnHgiqcu(TaBlUBcoaag`l)7@^dm@4z}3z@AL0 zb-pFDpXIB!c+yuKPUYH>yM6n`o-#)$E73Pz@;{Zhl$;0y|D^q>UAV#nsqfj$jJWrh zKU}lP7N_4GZA>Jm^RT7bHGX65+!#H6`n)c2SPv*sOW22MiMQi|Bz> zees_d;cQhAj4S;p+)G6t+H8VSLl`%<2Yud;Om^A1j!*Whw>s3l2qGz4woZNgt3T_b zRg(=;?v!PK&312p+Z8W2^&R}lP4Lu?``7a}2zfEcel&hH z_hvn~O<;NY2MH~7oiho-TY#(Y29-doKxu~*nJOi;j%PT$Rj6}8iylQJF&Ua%q?FNgU2 z)p1ZTa{iQiVm3?Nl=zG|m-uBxX2C`-5PdoDK*UVS#`M)2pASPg;N{+7Ct(%x8Yfws zYKnzFCZ6~sOCCsE##w7*0!(M-(B_h&u-Tz_!-+L2ySGeD`qV+!2d~8+J;IE=Y6HNc zMaCS@amjIAlf|3r+Mn;*!i1hD1H=Sa`*;yzOoq$!aQ7ScpnG&zp&{Sl}W%q z0Ii4!7U*BNtiBf18VjW8WCisB7;yo>5FQgOkT%Q@`p*&zqz5np1GoX;7pIo9v&V}Q z{BnfWKRc|QU#x$??td&9fRTtK7|ajhmX_fL^T=??adQg@O7qI{^GWi{fw_2iA-rOM ze;@LaM+NF+<6#Tnh6w%(5B~oEgc-+&IKx~?1~x9AyC!s`m0@FcG>ch#g%!K?c4<-J zEr@hY7UqMpby9t(81VUZBAjTMWn@aavxD6s5EB!Vyv+7QR0}mQ*NT83BuZPK%?i$* z!U&PH9zx0l&RBhjOA?%4l^3m(W48bZ{u0V&>IJHh4G}2P^Y#7x?7w9dGnz;qovfKG zl}wl9X!0?UCmCx2l2-WgF`q#vnmbcVEn%RoT_8?nciO$=vPZH~@YzTd)UqioZTGSG@2+i0b z<*7Ahg{)CmlVv2ou6~=5SUro@urp~FDJb&mFj%l{^6*3JT+2B0i^76djJ3c literal 0 HcmV?d00001 diff --git a/MLExamples/icf_4agent/docs/summary.tex b/MLExamples/icf_4agent/docs/summary.tex new file mode 100644 index 00000000..967a6019 --- /dev/null +++ b/MLExamples/icf_4agent/docs/summary.tex @@ -0,0 +1,453 @@ +\documentclass[conference]{IEEEtran} +\usepackage{cite} +\usepackage{amsmath,amssymb,amsfonts} +\usepackage{algorithmic} +\usepackage{graphicx} +\usepackage{textcomp} +\usepackage{xcolor} +\usepackage{tikz} +\usepackage{listings} +\usepackage{booktabs} +\usepackage{multirow} +\usetikzlibrary{shapes.geometric, arrows, positioning, fit, backgrounds} + +\lstset{ + language=Python, + basicstyle=\ttfamily\small, + keywordstyle=\color{blue}, + commentstyle=\color{green!50!black}, + stringstyle=\color{red}, + frame=single, + breaklines=true, + captionpos=b +} + +\begin{document} + +\title{Autonomous Optimization of ICF Capsule Designs via\\Adversarial Multi-Agent Systems and Reduced-Order Modeling} + +\author{\IEEEauthorblockN{Jon Belof} +\IEEEauthorblockA{\textit{Fellow, AI for Science} \\ +\textit{Advanced Micro Devices, Inc.}\\ +2485 Augustine Dr., Santa Clara, CA 95054\\ +jonathan.belof@amd.com} +} + +\maketitle + +\begin{abstract} +We present a multi-agent system for the autonomous optimization of Inertial Confinement Fusion (ICF) capsule designs under realistic manufacturing uncertainty. The system couples Large Language Model (LLM) reasoning agents with a reduced-order deceleration-phase surrogate model through the Model Context Protocol (MCP), enabling rapid evaluation of thousands of candidate designs. The optimization is formulated as a min-max game between a Design Explorer agent that maximizes fusion yield and a Defect Adversary agent that applies realistic manufacturing perturbations, orchestrated by a Principal Investigator agent. The physics surrogate integrates Hurricane's piston-driven stagnation mechanics with Betti's marginal ignition model, incorporating Spitzer thermal ablation, Gamow thermonuclear burn rates, and linear Rayleigh-Taylor instability growth. We demonstrate that the multi-agent system autonomously navigates the design space along constant-energy manifolds, converging in six rounds from an initial 7.4~MJ baseline to an 11.3~MJ optimized design (53\% yield improvement) that remains robust to mode-1 asymmetries up to $\delta = 0.012$ with RT growth factors below $3.6\times$. +\end{abstract} + +%============================================================================= +\section{Introduction} +%============================================================================= + +The design of Inertial Confinement Fusion (ICF) targets is a high-dimensional optimization problem in which small perturbations to the capsule geometry or drive symmetry can dramatically degrade performance. High-fidelity radiation hydrodynamics simulations capture the full physics but require $10^4$--$10^6$ CPU-hours per shot, precluding their use in iterative, agent-driven optimization loops. Recent experimental breakthroughs at the National Ignition Facility (NIF)---particularly the N210808 shot that achieved fusion fuel gain exceeding unity \cite{hurricane2014, abu-shawareb2024}---have motivated renewed interest in systematic design-space exploration to identify capsule geometries that are both high-performing and robust to manufacturing variability. + +We address this challenge with a multi-agent architecture in which LLM reasoning agents autonomously propose, perturb, evaluate, and iterate on capsule designs. The physics evaluation is performed by a reduced-order surrogate model that captures the essential deceleration-phase dynamics at negligible computational cost ($<1$~second per shot), enabling thousands of evaluations within a single optimization campaign. The agents communicate through the Model Context Protocol (MCP) \cite{mcp2024}, which cleanly decouples the reasoning layer from the simulation execution and provides a natural pathway to future integration with full radiation hydrodynamics codes on HPC clusters. + +The optimization is formulated as an adversarial game: a Design Explorer seeks to maximize fusion yield subject to a fixed laser energy budget, while a Defect Adversary applies manufacturing imperfections drawn from current NIF-class fabrication tolerances. This min-max formulation identifies designs that are not merely optimal under ideal conditions but robust to the perturbations that have historically prevented reproducible ignition. + +%============================================================================= +\section{Deceleration-Phase Surrogate Model} +\label{sec:model} +%============================================================================= + +\subsection{Asymmetric Dual-Piston Formulation} + +We model the stagnation phase of an ICF implosion using a zero-dimensional (0D) surrogate that tracks the deceleration, compression, and thermonuclear burn of the hot spot. Following the piston-driven framework of Hurricane \textit{et al.} \cite{hurricane2014}, the imploding shell is treated as a massive piston that decelerates against the rising hot-spot pressure. + +To capture mode-1 asymmetry---the dominant low-mode perturbation in NIF implosions arising from laser power imbalance and capsule positioning errors---we decompose the shell into two independent half-shells (``pistons'') with masses +\begin{equation} +M_1 = \frac{M_{sh}}{2}(1 + \delta), \qquad M_2 = \frac{M_{sh}}{2}(1 - \delta) +\label{eq:masses} +\end{equation} +where $M_{sh}$ is the total shell mass and $\delta \in [0, 0.15]$ is the mode-1 asymmetry fraction. Each piston has independent position $R_i$ and velocity $v_i$ governed by +\begin{equation} +\frac{dR_i}{dt} = v_i, \qquad \frac{dv_i}{dt} = \frac{A_{eff} \, P_{hs}}{M_i} +\label{eq:piston} +\end{equation} +where $A_{eff} = 4\pi R_{eff}^2$ is the effective hot-spot surface area, $R_{eff} = (R_1 + R_2)/2$ is the mean radius, and $P_{hs}$ is the hot-spot pressure derived from the internal energy via an ideal gas equation of state: +\begin{equation} +P_{hs} = \frac{2}{3} \frac{E_{hs}}{V}, \qquad V = \frac{4}{3}\pi R_{eff}^3 +\label{eq:pressure} +\end{equation} + +The asymmetry $\delta$ introduces differential deceleration of the two pistons: the lighter half-shell ($M_2$) decelerates faster, producing asymmetric stagnation radii and directing kinetic energy into residual motion rather than compression work. This residual kinetic energy +\begin{equation} +E_{RKE} = \frac{1}{2}M_1 v_1^2 + \frac{1}{2}M_2 v_2^2 +\label{eq:rke} +\end{equation} +represents energy unavailable for hot-spot heating and directly quantifies the yield penalty from mode-1 drive asymmetry. + +\subsection{Hot-Spot Energy Balance} + +The hot-spot internal energy evolves according to +\begin{equation} +\frac{dE_{hs}}{dt} = -P_{hs}\frac{dV}{dt} + W_\alpha - W_{rad} +\label{eq:energy} +\end{equation} +where the three terms represent compressive $PdV$ work (the dominant heating source during deceleration), alpha-particle self-heating, and radiative losses, respectively. + +\subsubsection{Thermonuclear Burn Rate} +The DT fusion reaction rate density is computed from the ion number density $n_i = \rho_{hs}/m_{DT}$ (where $m_{DT} = 2.5\,m_p$) using the NRL Plasma Formulary parametrization of the Gamow peak cross-section \cite{nrl2019}: +\begin{equation} +\langle\sigma v\rangle = 3.68 \times 10^{-12} \, T_{keV}^{-2/3} \exp\!\left(-19.94 \, T_{keV}^{-1/3}\right) \;\text{cm}^3/\text{s} +\label{eq:sigmav} +\end{equation} +This parametrization is preferred over the Bosch-Hale fit \cite{bosch1992} because it remains numerically stable across the full temperature range encountered during the explosive alpha-heating phase, avoiding the mathematical stiffness introduced by the polynomial denominator in the Bosch-Hale expression. The volumetric reaction rate is $R_{rxn} = (n_f/2)^2 \langle\sigma v\rangle \cdot V$, where $n_f$ is the fuel ion density (accounting for the evolving fuel fraction within the hot spot), and the alpha-heating power is +\begin{equation} +W_\alpha = R_{rxn} \cdot E_\alpha, \qquad E_\alpha = 3.5\;\text{MeV} +\label{eq:alpha} +\end{equation} + +\subsubsection{Radiative Losses} +Bremsstrahlung radiation is modeled as +\begin{equation} +W_{rad}^{vol} = 5.34 \times 10^{-37} \, n_i^2 \sqrt{T_{keV}} \cdot V \;\;\text{[W]} +\label{eq:bremsstrahlung} +\end{equation} +which is capped by the blackbody limit $W_{bb} = \sigma_{SB} T^4 \cdot 4\pi R_{eff}^2$ to prevent unphysical radiative losses at extreme temperatures. The effective radiative loss is $W_{rad} = \min(W_{rad}^{vol},\, W_{bb})$. + +\subsection{Spitzer Ablation and Hot-Spot Mass Evolution} + +Following the Betti marginal ignition model \cite{betti2002}, we couple the shell dynamics to the hot-spot mass through Spitzer electron thermal conduction. As the hot spot heats during compression, a thermal conduction front ablates material from the inner surface of the cold shell into the hot spot: +\begin{equation} +\frac{dM_{hs}}{dt} = C_{abl} \, R_{eff} \, T_{keV}^{5/2} +\label{eq:ablation} +\end{equation} +where $C_{abl}$ is the ablation coefficient and the $T^{5/2}$ dependence reflects the Spitzer thermal conductivity of a fully ionized plasma. This ablation is activated only when $T > 0.5$~keV to prevent unphysical mass injection at early, cold times. The ablated mass replenishes the DT fuel supply within the hot spot, while burned fuel is consumed at rate $\dot{M}_{fuel,burn} = R_{rxn} \cdot 2\,m_{DT}$. + +This dynamic mass coupling is physically important: it creates a positive feedback loop in which compression heating drives ablation, which increases the hot-spot density and hence the burn rate, which produces more alpha heating. This feedback is the mechanism by which marginal ignition transitions to propagating burn. + +\subsection{Rayleigh-Taylor Instability Growth} + +Hydrodynamic instabilities at the shell-hot-spot interface are tracked via the linear Rayleigh-Taylor (RT) growth rate. During deceleration ($g_{eff} > 0$), small perturbations at mode number $\ell$ grow as +\begin{equation} +\frac{d\xi}{dt} = \sqrt{k \, g_{eff}}, \qquad k = \frac{\ell}{R_{eff}} +\label{eq:rt} +\end{equation} +where $g_{eff} = (a_1 + a_2)/2$ is the mean deceleration and $\xi$ is the integrated growth exponent. The physical perturbation amplitude at stagnation is $A_{stag} = A_0 \exp(\xi)$, where $A_0$ is the initial surface roughness. When the RT amplitude approaches the shell thickness, the shell integrity is compromised and confinement is lost---a primary failure mode in under-performing NIF shots. + +\subsection{State Vector and Numerical Integration} + +The complete system is a 9-component ODE: +\begin{equation} +\mathbf{y} = \left[R_1,\, v_1,\, R_2,\, v_2,\, E_{hs},\, Y,\, \xi,\, M_{fuel},\, M_{hs}\right] +\label{eq:state} +\end{equation} +where $Y$ is the cumulative fusion yield ($dY/dt = 5\,W_\alpha$, the factor of 5 accounting for total fusion energy per alpha particle). The system is integrated using the \texttt{Radau} implicit Runge-Kutta method \cite{hairer1996} with adaptive stepping, which is essential for resolving the extreme stiffness introduced by the alpha-heating spike at ignition. Typical integration spans 0.6~ns with maximum step size $10^{-12}$~s and absolute tolerance $10^{-8}$. + +%============================================================================= +\section{Adversarial Optimization Formulation} +\label{sec:optimization} +%============================================================================= + +\subsection{Min-Max Game Structure} + +The design optimization is formulated as a two-player adversarial game: +\begin{equation} +\max_{\mathbf{x} \in \mathcal{X}} \;\; \min_{\mathbf{d} \in \mathcal{D}} \;\; Y(\mathbf{x}, \mathbf{d}) +\label{eq:minmax} +\end{equation} +where $\mathbf{x} = (R_0, v_0, T_0, M_{sh}, M_{hs})$ are the design variables controlled by the Explorer, $\mathbf{d} = (\delta, \ell, A_0)$ are the defect parameters controlled by the Adversary, and $Y$ is the total fusion yield. + +\subsection{Energy Constraint} + +The design space is constrained by the available laser energy. The kinetic energy of the imploding shell at the onset of deceleration is related to the laser energy through a hydrodynamic coupling efficiency $\eta$: +\begin{equation} +E_k = \frac{1}{2}M_{sh} v_0^2 = \eta \, E_{laser} +\label{eq:energy_constraint} +\end{equation} +For NIF-class indirect-drive implosions, $\eta \approx 0.015$ and $E_{laser} = 3$~MJ, giving a kinetic energy budget of $E_k = 45$~kJ. This constraint defines a one-dimensional manifold in $(M_{sh}, v_0)$ space: increasing shell mass requires decreasing implosion velocity, and vice versa. The fundamental tradeoff is between \textit{fuel inventory} (more mass to burn) and \textit{implosion vigor} (higher velocity for stronger compression and higher stagnation temperature). + +\subsection{Defect Bounds} + +The Adversary's parameter space is bounded by current manufacturing tolerances for NIF-class targets: +\begin{itemize} + \item \textbf{Mode-1 asymmetry} $\delta \in [0, 0.15]$: arising from laser power imbalance, beam pointing errors, and capsule offset within the hohlraum. Typical NIF values are $\delta \approx 0.02$--$0.05$; values above $0.10$ represent severe drive asymmetry. + \item \textbf{RT mode number} $\ell \in [2, 40]$: the dominant perturbation wavelength, with low modes ($\ell < 10$) from drive asymmetry and high modes ($\ell > 20$) from surface roughness and microstructure. + \item \textbf{Surface roughness} $A_0 \in [0, 3\,\mu\text{m}]$: the initial perturbation amplitude at the inner shell surface, set by fabrication quality. Current NIF capsules achieve $A_0 \approx 0.1$--$1.0\,\mu$m. +\end{itemize} + +These bounds are enforced at the server level: parameter values submitted outside these ranges are clamped and a warning is returned to the requesting agent, providing feedback that guides subsequent proposals. + +%============================================================================= +\section{Multi-Agent Architecture} +\label{sec:agents} +%============================================================================= + +\subsection{Agent Roles and Communication} + +The system comprises four agents coordinated through the AutoGen framework \cite{autogen2023} using structured group chat with constrained speaker transitions: + +\begin{enumerate} + \item \textbf{Principal Investigator (PI)}: The orchestrator agent, implemented on a frontier LLM. It coordinates the optimization campaign by sequentially engaging the Explorer and Adversary, validates the energy constraint (Eq.~\ref{eq:energy_constraint}), invokes the simulation tool, evaluates results against ignition criteria (yield $> 1$~MJ, stagnation pressure $> 100$~Gbar, RT amplification $< 1000\times$), and decides whether to iterate or terminate. The PI is the \textit{only} agent authorized to call the simulation tool. + + \item \textbf{Design Explorer}: Proposes capsule design parameters $\mathbf{x}$ to maximize yield. In production, this agent runs on a domain-specific LLM fine-tuned on ICF literature, enabling physics-informed design intuition beyond what is available from general-purpose models. It receives feedback from prior simulation results and adjusts parameters along the constant-energy manifold. + + \item \textbf{Defect Adversary}: Proposes manufacturing defect parameters $\mathbf{d}$ to stress-test the Explorer's designs. It follows a systematic strategy: probing individual defect modes in early rounds to identify the design's primary sensitivity, then combining the most damaging perturbations in later rounds. + + \item \textbf{User Proxy}: An execution bridge that receives tool calls from the PI and dispatches them to the MCP server. It performs no reasoning and does not modify parameters. +\end{enumerate} + +\subsection{Speaker Transition Constraints} + +To prevent degenerate conversation patterns (infinite loops, role confusion, agents attempting unauthorized tool calls), the group chat enforces hard speaker transition constraints: + +\begin{center} +\begin{tabular}{ll} +\toprule +\textbf{After speaker} & \textbf{Allowed next speakers} \\ +\midrule +User Proxy & PI only \\ +PI & Explorer, Adversary, or User Proxy \\ +Explorer & PI only \\ +Adversary & PI only \\ +\bottomrule +\end{tabular} +\end{center} + +This ensures a hub-and-spoke topology: all information flows through the PI, which maintains global state and enforces the optimization protocol. The Explorer and Adversary cannot communicate directly or invoke tools. + +\subsection{MCP Tool Server} + +The physics surrogate is served as an MCP tool via the FastMCP framework. The tool interface accepts all 8 physical parameters in SI units and returns structured simulation results (stagnation metrics, fusion yield, burn fraction, residual kinetic energy, RT amplification). The MCP server enforces hard physical bounds on all input parameters (Table~\ref{tab:bounds}), clamping out-of-range values and returning warnings to the calling agent. This server-side validation is essential because LLM agents frequently propose values outside specified bounds despite prompt instructions. + +\begin{table}[htbp] +\caption{Parameter Bounds Enforced by the MCP Server} +\label{tab:bounds} +\centering +\begin{tabular}{llll} +\toprule +\textbf{Parameter} & \textbf{Min} & \textbf{Max} & \textbf{Units} \\ +\midrule +$R_0$ & $3 \times 10^{-5}$ & $5 \times 10^{-4}$ & m \\ +$v_0$ & $-8 \times 10^{5}$ & $-1 \times 10^{5}$ & m/s \\ +$T_0$ & 0.1 & 10.0 & keV \\ +$M_{sh}$ & $10^{-8}$ & $2 \times 10^{-6}$ & kg \\ +$M_{hs}$ & $10^{-9}$ & $10^{-7}$ & kg \\ +$\delta$ & 0.0 & 0.15 & --- \\ +$\ell$ & 2 & 40 & --- \\ +$A_0$ & 0.0 & $3 \times 10^{-6}$ & m \\ +\bottomrule +\end{tabular} +\end{table} + +The decoupling of physics execution from agent reasoning via MCP is architecturally significant: it allows the simulation backend to be replaced transparently---from the 0D surrogate used here, to a 1D Lagrangian hydrocode, to a full 2D/3D radiation hydrodynamics code on an HPC cluster---without modifying any agent logic. + +\begin{figure}[htbp] +\centering +\begin{tikzpicture}[ + node distance=1.0cm and 0.4cm, + box/.style={rectangle, draw=black, thick, fill=blue!10, text width=1.8cm, align=center, minimum height=0.8cm, rounded corners, font=\footnotesize}, + tool/.style={rectangle, draw=black, thick, fill=green!10, text width=2.2cm, align=center, minimum height=0.8cm, font=\footnotesize}, + arrow/.style={thick, ->, >=stealth} +] + +\node (pi) [box, fill=purple!15, text width=2.2cm] {Principal\\Investigator\\(Orchestrator)}; +\node (explorer) [box, below left=of pi] {Design\\Explorer\\(Domain LLM)}; +\node (adversary) [box, below right=of pi] {Defect\\Adversary\\(Frontier LLM)}; +\node (proxy) [box, below=1.5cm of pi] {User Proxy\\(Bridge)}; +\node (mcp) [tool, below=of proxy] {MCP Server\\(ICF Surrogate)}; + +\draw [arrow, <->] (pi) -- (explorer) node[midway, left, font=\scriptsize] {$\mathbf{x}$}; +\draw [arrow, <->] (pi) -- (adversary) node[midway, right, font=\scriptsize] {$\mathbf{d}$}; +\draw [arrow, <->] (pi) -- (proxy) node[midway, right, font=\scriptsize] {Tools}; +\draw [arrow, <->] (proxy) -- (mcp) node[midway, right, font=\scriptsize] {stdio}; + +\begin{scope}[on background layer] + \node [draw=gray, dashed, thick, fit=(pi) (explorer) (adversary) (proxy), inner sep=0.2cm, label=above:{\footnotesize\textbf{AutoGen Agent Swarm}}] {}; +\end{scope} + +\end{tikzpicture} +\caption{Architecture of the 4-agent system. The PI orchestrates the adversarial game, delegating design proposals ($\mathbf{x}$) to the Explorer and defect proposals ($\mathbf{d}$) to the Adversary. Only the PI invokes the MCP physics server through the User Proxy.} +\label{fig:architecture} +\end{figure} + +\subsection{Streaming Interface} + +The agent swarm is served through a Gradio web interface that provides real-time visibility into the multi-agent conversation. The AutoGen group chat runs in a background thread while a generator function polls the shared message list, yielding each agent's contribution to the browser as it is produced. This streaming architecture allows users to monitor the optimization in real time, observing the Explorer's design rationale, the Adversary's perturbation strategy, and the PI's evaluation of each simulation result. + +%============================================================================= +\section{Results} +\label{sec:results} +%============================================================================= + +\subsection{Design Space Exploration Along Constant-Energy Manifolds} + +Table~\ref{tab:ke_sweep} presents a systematic exploration of the $(M_{sh}, v_0)$ tradeoff along the 45~kJ constant-energy manifold at fixed $R_0 = 150\,\mu$m, $T_0 = 1.0$~keV, $M_{hs} = 5$~ng, and zero defects. Yield increases monotonically with shell mass (at correspondingly lower velocity), from 4.2~MJ at $M_{sh} = 0.1\,\mu$g to 11.4~MJ at $M_{sh} = 1.0\,\mu$g. This reflects the dominant role of fuel inventory: more DT mass produces more burn even at reduced implosion velocity, provided the stagnation conditions remain above the ignition threshold. + +\begin{table}[htbp] +\caption{Design Exploration Along the 45~kJ Energy Manifold} +\label{tab:ke_sweep} +\centering +\begin{tabular}{cccc} +\toprule +$M_{sh}$ [$\mu$g] & $|v_0|$ [km/s] & Yield [MJ] & Burn [\%] \\ +\midrule +0.10 & 949 & 4.24 & 15.0 \\ +0.20 & 671 & 5.93 & 16.0 \\ +0.25 & 600 & 6.56 & 16.2 \\ +0.36 & 500 & 7.70 & 16.5 \\ +0.50 & 424 & 8.84 & 16.6 \\ +0.80 & 335 & 10.6 & 16.6 \\ +1.00 & 300 & 11.4 & 16.6 \\ +\bottomrule +\end{tabular} +\end{table} + +The burn fraction saturates near 16.6\%, consistent with the Betti marginal ignition scaling in which the burn-up fraction is primarily determined by the areal density at stagnation rather than the total fuel mass \cite{betti2002}. + +\subsection{Sensitivity to Initial Conditions} + +The surrogate exhibits sharp ignition cliffs in several parameters, reflecting the threshold nature of thermonuclear ignition. At fixed baseline conditions ($M_{sh} = 0.25\,\mu$g, $v_0 = -450$~km/s, $\delta = 0.05$): + +\begin{itemize} + \item \textbf{Stagnation radius}: Yield drops from 7.0~MJ at $R_0 = 150\,\mu$m to 0.06~MJ at $R_0 = 200\,\mu$m---a $100\times$ reduction from a 33\% increase in radius. Larger $R_0$ reduces the convergence ratio, producing insufficient compression for ignition. + + \item \textbf{Initial temperature}: Yield peaks at $T_0 \approx 1.0$~keV and drops precipitously above 1.5~keV. Higher initial temperatures reduce the density at fixed pressure, weakening the compressive $PdV$ heating during deceleration. + + \item \textbf{Hot-spot mass}: Yield peaks near $M_{hs} = 5$~ng and drops to near zero above 10~ng. Excessive initial hot-spot mass dilutes the temperature at fixed energy, preventing the plasma from reaching the $\sim$$5$~keV threshold where alpha heating becomes dominant. +\end{itemize} + +These cliffs define the boundaries of the ignition region and constrain the Explorer's viable design space. + +\subsection{Robustness to Mode-1 Asymmetry} + +Table~\ref{tab:delta} compares the defect sensitivity of three designs along the 45~kJ manifold under increasing mode-1 asymmetry with $\ell = 20$ and $A_0 = 2\,\mu$m. + +\begin{table}[htbp] +\caption{Yield and Residual KE vs.\ Mode-1 Asymmetry $\delta$} +\label{tab:delta} +\centering +\begin{tabular}{ccccc} +\toprule +\multirow{2}{*}{$\delta$} & \multicolumn{2}{c}{Baseline ($0.25\,\mu$g)} & \multicolumn{2}{c}{Optimized ($0.36\,\mu$g)} \\ +\cmidrule(lr){2-3} \cmidrule(lr){4-5} +& $Y$ [MJ] & $E_{RKE}$ [J] & $Y$ [MJ] & $E_{RKE}$ [J] \\ +\midrule +0.00 & 7.02 & 6.8 & 8.17 & 1918 \\ +0.04 & 7.02 & 49 & 8.16 & 2036 \\ +0.08 & 7.01 & 178 & 8.15 & 2389 \\ +0.12 & 7.00 & 395 & 8.12 & 2972 \\ +0.15 & 6.99 & 617 & 8.10 & 6315 \\ +\bottomrule +\end{tabular} +\end{table} + +Both designs maintain ignition across the full range of physically realistic asymmetries. The baseline design shows remarkable stability: yield degrades by only 0.4\% ($\Delta Y = 0.03$~MJ) even at the maximum asymmetry $\delta = 0.15$. The optimized design achieves 16\% higher absolute yield but exhibits larger residual kinetic energy, indicating less efficient energy coupling at stagnation. Under worst-case combined defects ($\delta = 0.12$, $\ell = 20$, $A_0 = 2\,\mu$m), the high-mass design ($M_{sh} = 1.0\,\mu$g, $v_0 = 300$~km/s) achieves the highest yield of 11.4~MJ with modest residual KE of 684~J. + +\subsection{Rayleigh-Taylor Amplification} + +Table~\ref{tab:rt} shows the RT amplification factor at stagnation as a function of perturbation mode number for the baseline design. The exponential growth characteristic of the linear RT instability produces amplification factors exceeding $10^3$ at $\ell = 30$, indicating that high-mode surface perturbations can grow to amplitudes comparable to the shell thickness during deceleration. In the current 0D model, RT growth is tracked diagnostically and does not feed back into the yield calculation; coupling RT-induced mix into the hot-spot energy balance is a planned extension. + +\begin{table}[htbp] +\caption{RT Amplification Factor vs.\ Mode Number} +\label{tab:rt} +\centering +\begin{tabular}{cc} +\toprule +Mode $\ell$ & Amplification $e^\xi$ \\ +\midrule +2 & $6.1\times$ \\ +5 & $17\times$ \\ +10 & $57\times$ \\ +15 & $142\times$ \\ +20 & $305\times$ \\ +30 & $1104\times$ \\ +40 & $3262\times$ \\ +\bottomrule +\end{tabular} +\end{table} + +\subsection{Autonomous Optimization Campaign} + +To demonstrate the end-to-end system, we executed a complete adversarial optimization campaign using the domain-specific \texttt{gptoss-20b-hedp} model (a 20B parameter LLM fine-tuned on HEDP literature) served via vLLM on AMD MI355X GPUs. The campaign proceeded autonomously through six rounds of design iteration, defect testing, and parameter refinement, converging on a high-yield design robust to manufacturing defects. Table~\ref{tab:campaign} summarizes the optimization trajectory. + +\begin{table}[htbp] +\caption{Autonomous Agent Optimization Campaign} +\label{tab:campaign} +\centering +\begin{tabular}{clccc} +\toprule +Round & Design Change & $\delta$ & $Y$ [MJ] & $\Delta Y$ \\ +\midrule +1 & Baseline ($M_{sh}\!=\!0.265\,\mu$g, & 0.04 & 7.4 & --- \\ + & $|v_0|\!=\!585$~km/s) & & & \\ +2 & High-mode stress test & 0.015 & 5.8 & $-22\%$ \\ +3 & Heavier shell ($M_{sh}\!=\!0.28\,\mu$g, & 0.02 & 9.3 & $+60\%$ \\ + & $|v_0|\!=\!600$~km/s, $T_0\!=\!1.8$~keV) & & & \\ +4 & Tighter defect ($\delta\!=\!0.012$) & 0.012 & 9.8 & $+5.4\%$ \\ +5 & Light shell, high velocity & 0.01 & 11.3 & $+15\%$ \\ + & ($M_{sh}\!=\!0.245\,\mu$g, $|v_0|\!=\!610$~km/s) & & & \\ +6 & Hot-spot boost ($T_0\!=\!2.2$~keV) & 0.01 & 11.3 & $<1\%$ \\ +\bottomrule +\end{tabular} +\end{table} + +Several features of the agent behavior merit discussion: + +\textbf{Adversary strategy.} The Defect Adversary autonomously varied its perturbation strategy across rounds, first applying moderate mode-1 asymmetry ($\delta = 0.04$, $\ell = 10$), then switching to a high-mode surface roughness attack ($\delta = 0.015$, $\ell = 30$, $A_0 = 2\,\mu$m) that reduced yield by 22\%. This systematic probing---low-mode first, then high-mode---was specified in the agent's system prompt but the specific parameter choices were determined autonomously by the LLM. + +\textbf{Explorer adaptation.} After the high-mode defect reduced yield to 5.8~MJ in Round~2, the Design Explorer autonomously shifted to a heavier-shell, higher-velocity design point on the constant-energy manifold, recovering yield to 9.3~MJ in Round~3. The Explorer then proposed a ``light shell, high velocity'' variant that traded shell mass for implosion velocity, reaching 11.3~MJ---a 53\% improvement over the initial baseline. + +\textbf{Convergence.} The PI agent tracked yield improvements across rounds and initiated a defect-sensitivity sweep when the yield plateau was approached. The sweep revealed that the optimized design maintains $Y > 10$~MJ for $\delta \leq 0.012$ with RT growth factors below $3.6\times$, establishing a quantitative stability margin. The campaign terminated when yield improvement fell below the 5\% threshold for two consecutive rounds. + +\textbf{Defect-sensitivity of the final design.} Table~\ref{tab:agent_sweep} presents the defect sweep conducted autonomously by the agent system for the optimized design ($M_{sh} = 0.245\,\mu$g, $|v_0| = 610$~km/s, $T_0 = 2.0$~keV). + +\begin{table}[htbp] +\caption{Agent-Directed Defect Sweep of Optimized Design} +\label{tab:agent_sweep} +\centering +\begin{tabular}{cccc} +\toprule +$\delta$ & Yield [MJ] & $P_{stag}$ [Mbar] & RT Growth \\ +\midrule +0.008 & 11.7 & 1.92 & $2.7\times$ \\ +0.010 & 11.3 & 1.90 & $3.1\times$ \\ +0.012 & 10.8 & 1.88 & $3.6\times$ \\ +\bottomrule +\end{tabular} +\end{table} + +The final recommended design achieves 11.3~MJ at $\delta = 0.01$ with comfortable stability margin, representing a $53\%$ yield improvement over the initial N210808-inspired baseline within the same 45~kJ kinetic energy budget. + +%============================================================================= +\section{Discussion} +%============================================================================= + +The results demonstrate that the multi-agent system autonomously discovers the key design tradeoffs in ICF. The parametric sweeps (Tables~\ref{tab:ke_sweep}--\ref{tab:rt}) establish the structure of the design space, while the autonomous campaign (Tables~\ref{tab:campaign}--\ref{tab:agent_sweep}) shows the agents navigating this space in real time. Notably, the agents autonomously discovered the velocity-for-mass tradeoff along the constant-energy manifold: after a high-mode defect reduced yield by 22\% in Round~2, the Explorer shifted to a lighter, faster shell that recovered and exceeded the original yield, ultimately achieving an 11.3~MJ design robust to $\delta \leq 0.012$ --- a 53\% improvement over the initial baseline within the same energy budget. + +Several limitations of the current surrogate should be noted. First, the RT instability is tracked but does not degrade confinement or inject cold material into the hot spot; incorporating RT-induced mix would sharpen the ignition cliff at high mode numbers and penalize designs with large convergence ratios. Second, the model assumes a single-temperature plasma ($T_i \approx T_e$), neglecting ion-electron equilibration dynamics that are important at early times. Third, the 0D geometry cannot capture multidimensional effects such as jet formation from mode-1 asymmetry or the development of turbulent mix layers. Despite these limitations, the surrogate correctly reproduces the qualitative scaling of yield with implosion velocity, shell mass, and asymmetry observed in NIF experiments. + +The MCP-based architecture provides a clear upgrade path: replacing the surrogate with a 1D Lagrangian hydrocode (e.g., LILAC or HYDRA in 1D mode) would capture shock timing, ablation-front RT growth, and equation-of-state effects while remaining fast enough for agent-driven optimization. Integration with full 2D/3D radiation hydrodynamics codes would require asynchronous job submission to HPC clusters, but the MCP protocol supports this naturally through its tool-call abstraction. + +%============================================================================= +\section{Conclusions} +%============================================================================= + +We have presented a multi-agent system that autonomously optimizes ICF capsule designs under adversarial manufacturing uncertainty. The key contributions are: + +\begin{enumerate} + \item A deceleration-phase surrogate model combining Hurricane's dual-piston stagnation mechanics with Betti's Spitzer ablation and marginal ignition physics, integrated as a stiff 9-component ODE system. + \item An adversarial min-max optimization formulation (Eq.~\ref{eq:minmax}) that discovers designs robust to mode-1 asymmetry, RT instability, and surface roughness within NIF-class manufacturing tolerances. + \item A 4-agent architecture with constrained speaker transitions and server-enforced parameter bounds, addressing practical challenges of LLM-driven optimization (unit confusion, role drift, out-of-bounds proposals). + \item Demonstration of autonomous convergence: agents navigate the $(M_{sh}, v_0)$ manifold over six rounds, improving yield from 7.4~MJ to 11.3~MJ (53\% gain) while maintaining robustness to $\delta \leq 0.012$ asymmetry, with yield-plateau stopping criteria terminating the campaign automatically. +\end{enumerate} + +The MCP-based decoupling of reasoning agents from physics execution provides a natural pathway to scaling this approach to high-fidelity radiation hydrodynamics simulations on HPC clusters, transforming the human-in-the-loop design bottleneck into an automated, adversarially robust optimization cycle. + +\begin{thebibliography}{00} +\bibitem{hurricane2014} O. A. Hurricane \textit{et al.}, ``Fuel gain exceeding unity in an inertially confined fusion implosion,'' \textit{Nature}, vol. 506, pp. 343--348, 2014. +\bibitem{abu-shawareb2024} H. Abu-Shawareb \textit{et al.}, ``Achievement of target gain larger than unity in an inertial fusion experiment,'' \textit{Phys. Rev. Lett.}, vol. 132, p. 065102, 2024. +\bibitem{betti2002} R. Betti \textit{et al.}, ``Deceleration phase of inertial confinement fusion implosions,'' \textit{Phys. Plasmas}, vol. 9, no. 5, pp. 2277--2286, 2002. +\bibitem{nrl2019} J. D. Huba, \textit{NRL Plasma Formulary}, Naval Research Laboratory, Washington, DC, 2019. +\bibitem{bosch1992} H.-S. Bosch and G. M. Hale, ``Improved formulas for fusion cross-sections and thermal reactivities,'' \textit{Nucl. Fusion}, vol. 32, no. 4, pp. 611--631, 1992. +\bibitem{hairer1996} E. Hairer and G. Wanner, \textit{Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems}, 2nd ed. Berlin: Springer, 1996. +\bibitem{mcp2024} Anthropic, ``Model Context Protocol Specification,'' 2024. [Online]. Available: https://modelcontextprotocol.io +\bibitem{autogen2023} Q. Wu \textit{et al.}, ``AutoGen: Enabling next-gen LLM applications via multi-agent conversation,'' \textit{arXiv preprint arXiv:2308.08155}, 2023. +\end{thebibliography} + +\end{document} diff --git a/MLExamples/icf_4agent/icf_core.py b/MLExamples/icf_4agent/icf_core.py new file mode 100644 index 00000000..e6a424f9 --- /dev/null +++ b/MLExamples/icf_4agent/icf_core.py @@ -0,0 +1,253 @@ +import sys +import argparse +import numpy as np +from scipy.integrate import solve_ivp +from scipy.constants import k, m_p, e, Stefan_Boltzmann +import matplotlib.pyplot as plt +import os + +# --- Physical Constants --- +E_ALPHA = 3.5e6 * e +M_DT = 2.5 * m_p +SIGMA_SB = Stefan_Boltzmann + +def nrl_dt_reactivity(T_keV): + """Unconditionally stable Gamow fit from the NRL Plasma Formulary.""" + if T_keV < 0.5: return 0.0 + T = min(T_keV, 100.0) + # NRL formula yields cm^3/s, multiply by 1e-6 for m^3/s + sigmav_cm3 = 3.68e-12 * (T**(-2.0/3.0)) * np.exp(-19.94 * (T**(-1.0/3.0))) + return sigmav_cm3 * 1e-6 + +def asymmetric_odes(t, y, M1, M2, mode_number): + R1, v1, R2, v2, E_hs, yield_J, rt_int, M_fuel, M_hs = y + + # Hard clamps to protect the solver from unphysical undershoots + R1 = max(R1, 1e-9) + R2 = max(R2, 1e-9) + E_hs = max(E_hs, 1e-9) + M_hs = max(M_hs, 1e-12) + M_fuel = max(M_fuel, 0.0) + + R_eff = (R1 + R2) / 2.0 + V = (4.0 / 3.0) * np.pi * R_eff**3 + P_hs = (2.0 / 3.0) * E_hs / V + + rho_hs = M_hs / V + n_ion = rho_hs / M_DT + T_K = P_hs / (2.0 * n_ion * k) if n_ion > 0 else 0.0 + T_keV = T_K / 1.16045e7 + T_keV = max(T_keV, 1e-5) + + # Flux-Limited Spitzer Ablation + T_keV_abl = min(T_keV, 15.0) + C_abl = 50000.0 + # Prevent ablation shock at early, cold times + dM_hs_dt = C_abl * R_eff * (T_keV_abl**2.5) if T_keV > 0.5 else 0.0 + + sigmav = nrl_dt_reactivity(T_keV) + + fuel_fraction = M_fuel / M_hs if M_hs > 0 else 0.0 + n_fuel_ion = n_ion * fuel_fraction + + rate_density = (n_fuel_ion / 2.0)**2 * sigmav + R_rxn = rate_density * V + + W_alpha = R_rxn * E_ALPHA + + # Blackbody Radiative Cap + W_rad_volumetric = 5.34e-37 * (n_ion**2) * np.sqrt(T_keV) * V + W_blackbody = SIGMA_SB * (T_K**4) * (4.0 * np.pi * R_eff**2) + W_rad = min(W_rad_volumetric, W_blackbody) + + # Force the yield derivative to be strictly positive + dW_yield_dt = max(0.0, 5.0 * W_alpha) + + # Replenish fuel with ablated shell mass + dM_fuel_dt = dM_hs_dt - R_rxn * (2.0 * M_DT) + + A_eff = 4.0 * np.pi * R_eff**2 + dv1_dt = (A_eff * P_hs) / M1 + dv2_dt = (A_eff * P_hs) / M2 + + dV_dt = A_eff * ((v1 + v2) / 2.0) + dE_dt = -P_hs * dV_dt + W_alpha - W_rad + + g_eff = (dv1_dt + dv2_dt) / 2.0 + dRT_dt = 0.0 + if g_eff > 0: + wave_number = mode_number / R_eff + dRT_dt = np.sqrt(wave_number * g_eff) + + return [v1, dv1_dt, v2, dv2_dt, dE_dt, dW_yield_dt, dRT_dt, dM_fuel_dt, dM_hs_dt] + +def plot_synthetic_density(R1, R2, rt_exponent, time_val, step, mode_number, initial_roughness, output_dir="implosion_frames"): + os.makedirs(output_dir, exist_ok=True) + grid_size = 600 + L = 200e-6 + x = np.linspace(-L, L, grid_size) + y = np.linspace(-L, L, grid_size) + X, Y = np.meshgrid(x, y) + + distance = np.sqrt(X**2 + Y**2) + angles = np.arctan2(Y, X) + + R_theta = np.where(X < 0, R1, R2) + rt_amp = initial_roughness * np.exp(rt_exponent) + R_perturbed = R_theta + rt_amp * np.cos(mode_number * angles) + + density_map = np.zeros_like(X) + shell_thickness = 15e-6 + + shell_mask = (distance > R_perturbed) & (distance < R_perturbed + shell_thickness) + hotspot_mask = distance <= R_perturbed + + density_map[shell_mask] = 100.0 + density_map[hotspot_mask] = 10.0 + + plt.figure(figsize=(6,6)) + plt.pcolormesh(X*1e6, Y*1e6, density_map, cmap='magma', shading='nearest') + plt.title(f"Synthetic RT + Mode-1 Model: t = {time_val*1e9:.3f} ns\n(Delta={abs(R1-R2)/(R1+R2):.2f}, l={mode_number})") + plt.xlabel("X (um)") + plt.ylabel("Y (um)") + plt.xlim(-200, 200) + plt.ylim(-200, 200) + + plt.savefig(f"{output_dir}/frame_{step:03d}.png", dpi=300, bbox_inches='tight') + plt.close() + +def plot_time_histories(sol, M1, M2, output_dir="implosion_frames"): + os.makedirs(output_dir, exist_ok=True) + + t_ns = sol.t * 1e9 + R1 = sol.y[0] + R2 = sol.y[2] + R_eff = (R1 + R2) / 2.0 + V = (4.0 / 3.0) * np.pi * R_eff**3 + E_hs = sol.y[4] + M_hs_total = sol.y[8] + + rho_hs = M_hs_total / V + rhoR_hs_gcm2 = (rho_hs * R_eff) * 0.1 + rhoR_shell_gcm2 = ((M1 + M2) / (4.0 * np.pi * R_eff**2)) * 0.1 + + P_hs = (2.0 / 3.0) * E_hs / V + n_ion = rho_hs / M_DT + T_keV = np.zeros_like(P_hs) + valid = n_ion > 0 + T_keV[valid] = (P_hs[valid] / (2.0 * n_ion[valid] * k)) / 1.16045e7 + + fig, axs = plt.subplots(3, 1, figsize=(8, 10), sharex=True) + + axs[0].plot(t_ns, R1*1e6, label='R1 (Left Piston)', color='blue') + axs[0].plot(t_ns, R2*1e6, label='R2 (Right Piston)', color='red', linestyle='--') + axs[0].set_ylabel('Radius (um)') + axs[0].set_title('Implosion Trajectory') + axs[0].legend() + axs[0].grid(True, alpha=0.5) + + axs[1].plot(t_ns, rhoR_shell_gcm2, label='Shell $\\rho R$', color='green') + axs[1].plot(t_ns, rhoR_hs_gcm2, label='Hot Spot $\\rho R$', color='orange') + axs[1].set_ylabel('Areal Density (g/cm$^2$)') + axs[1].set_yscale('log') + axs[1].legend() + axs[1].grid(True, alpha=0.5) + + axs[2].plot(t_ns, T_keV, label='$T_{ion} \\approx T_{elec}$', color='purple') + axs[2].set_ylabel('Temperature (keV)') + axs[2].set_xlabel('Time (ns)') + axs[2].legend() + axs[2].grid(True, alpha=0.5) + + plt.tight_layout() + plt.savefig(f"{output_dir}/time_histories.png", dpi=300, bbox_inches='tight') + plt.close() + +def main(): + parser = argparse.ArgumentParser(description="2D Asymmetric Piston Surrogate") + parser.add_argument('--R0', type=float, default=150e-6) + parser.add_argument('--v0', type=float, default=-450e3) + parser.add_argument('--T0', type=float, default=1.0) + parser.add_argument('--M_sh', type=float, default=0.25e-6) + parser.add_argument('--M_hs', type=float, default=0.005e-6) + parser.add_argument('--delta', type=float, default=0.0) + parser.add_argument('--mode', type=float, default=10.0) + parser.add_argument('--roughness', type=float, default=0.1e-6) + parser.add_argument('--plot', action='store_true') + + args = parser.parse_args() + + M1 = (args.M_sh / 2.0) * (1.0 + args.delta) + M2 = (args.M_sh / 2.0) * (1.0 - args.delta) + + V0 = (4.0 / 3.0) * np.pi * args.R0**3 + P_hs0 = 2.0 * (args.M_hs / V0 / M_DT) * k * (args.T0 * 1.16045e7) + E_hs0 = 1.5 * P_hs0 * V0 + + y0 = [args.R0, args.v0, args.R0, args.v0, E_hs0, 0.0, 0.0, args.M_hs, args.M_hs] + + t_span = (0, 0.6e-9) + t_eval = np.linspace(0, 0.6e-9, 200) + + print(f"Simulating implosion (Delta = {args.delta}, Mode = {args.mode})...") + + # Safely back on Radau. No custom tolerance arrays to trip it up. + sol = solve_ivp(asymmetric_odes, t_span, y0, t_eval=t_eval, method='Radau', + args=(M1, M2, args.mode), rtol=1e-6, atol=1e-8, max_step=1e-12) + + if len(sol.t) < len(t_eval): + print(f"Warning: ODE solver stopped early at step {len(sol.t)}.") + + R_eff_array = (sol.y[0] + sol.y[2]) / 2.0 + stag_idx = np.argmin(R_eff_array) + + if args.plot: + print("Generating high-resolution PNGs and time-history traces...") + output_dir = "implosion_frames" + plot_time_histories(sol, M1, M2, output_dir=output_dir) + + end_idx = min(stag_idx + 20, len(sol.t)) + for i in range(0, end_idx, 2): + plot_synthetic_density( + sol.y[0][i], sol.y[2][i], sol.y[6][i], sol.t[i], i, + args.mode, args.roughness, output_dir=output_dir + ) + print(f"Saved visualization files to the '{output_dir}/' directory.") + + R1_stag = sol.y[0][stag_idx] + R2_stag = sol.y[2][stag_idx] + v1_stag = sol.y[1][stag_idx] + v2_stag = sol.y[3][stag_idx] + + RKE = 0.5 * M1 * v1_stag**2 + 0.5 * M2 * v2_stag**2 + + E_hs_stag = sol.y[4][stag_idx] + V_stag = (4.0 / 3.0) * np.pi * ((R1_stag + R2_stag)/2.0)**3 + P_stag = (2.0 / 3.0) * E_hs_stag / V_stag + + rt_exponent = sol.y[6][stag_idx] + rt_amplification = np.exp(rt_exponent) + + # Force diagnostic yield to non-negative just in case + final_yield_MJ = max(0.0, sol.y[5][-1] / 1e6) + + initial_fuel_ug = args.M_hs * 1e9 + final_fuel_ug = max(0.0, sol.y[7][-1] * 1e9) + total_ablated_mass_ug = max(0.0, (sol.y[8][-1] - args.M_hs) * 1e9) + + total_pool = initial_fuel_ug + total_ablated_mass_ug + burned_fraction = ((total_pool - final_fuel_ug) / total_pool * 100.0) if total_pool > 0 else 0.0 + + print(f"\n--- Asymmetric Mode-1 Metrics (Delta = {args.delta}) ---") + print(f"Stagnation Radius (Left): {R1_stag*1e6:.2f} um") + print(f"Stagnation Radius (Right): {R2_stag*1e6:.2f} um") + print(f"Stagnation Pressure: {P_stag / 1e14:.2f} Gbar") + print(f"Total Fusion Yield: {final_yield_MJ:.3f} MJ") + print(f"Ablated Mass Injected: {total_ablated_mass_ug:.2f} ug") + print(f"Fuel Burn Fraction: {burned_fraction:.2f}% (Total Pool: {total_pool:.2f} ug)") + print(f"Residual Kinetic Energy: {RKE:.2f} Joules") + print(f"RT Amplification (l={args.mode}): {rt_amplification:.2f}x initial perturbation") + +if __name__ == "__main__": + main() + diff --git a/MLExamples/icf_4agent/icf_mcp_server.py b/MLExamples/icf_4agent/icf_mcp_server.py new file mode 100644 index 00000000..37b30606 --- /dev/null +++ b/MLExamples/icf_4agent/icf_mcp_server.py @@ -0,0 +1,71 @@ +from mcp.server.fastmcp import FastMCP +import subprocess +import sys +import os + +mcp = FastMCP("ICF_Surrogate_Engine") + +# Hard physical bounds — values outside these are unphysical or break the solver +PARAM_BOUNDS = { + "R0": (30e-6, 500e-6), # stagnation radius: 30-500 um + "v0": (-800e3, -100e3), # implosion velocity: 100-800 km/s (negative = inward) + "T0": (0.1, 10.0), # initial hotspot temperature: 0.1-10 keV + "M_sh": (0.01e-6, 2.0e-6), # shell mass: 0.01-2.0 ug + "M_hs": (1e-9, 0.1e-6), # hotspot mass: 0.001-100 ng + "delta": (0.0, 0.15), # mode-1 asymmetry fraction: 0-15% + "mode": (2.0, 40.0), # RT mode number + "roughness": (0.0, 3.0e-6), # surface roughness: 0-3 um +} + +def _clamp(name, value): + lo, hi = PARAM_BOUNDS[name] + clamped = max(lo, min(hi, value)) + if clamped != value: + return clamped, f" WARNING: {name}={value:.4e} clamped to [{lo:.4e}, {hi:.4e}] -> {clamped:.4e}\n" + return clamped, "" + +@mcp.tool() +def run_icf_implosion( + R0: float, v0: float, T0: float, M_sh: float, M_hs: float, + delta: float, mode: float, roughness: float +) -> str: + """ + Runs the ICF implosion surrogate and returns the physics metrics. + All inputs must be in strict SI units (meters, kg, m/s). + + Parameter bounds enforced by the server: + R0: [30e-6, 500e-6] m (stagnation radius) + v0: [-800e3, -100e3] m/s (implosion velocity, must be negative) + T0: [0.1, 10.0] keV (initial hotspot temperature) + M_sh: [0.01e-6, 2.0e-6] kg (shell mass) + M_hs: [1e-9, 0.1e-6] kg (initial hotspot mass) + delta: [0.0, 0.15] (mode-1 asymmetry fraction) + mode: [2, 40] (RT perturbation mode number) + roughness: [0.0, 3.0e-6] m (surface roughness) + """ + warnings = "" + R0, w = _clamp("R0", R0); warnings += w + v0, w = _clamp("v0", v0); warnings += w + T0, w = _clamp("T0", T0); warnings += w + M_sh, w = _clamp("M_sh", M_sh); warnings += w + M_hs, w = _clamp("M_hs", M_hs); warnings += w + delta, w = _clamp("delta", abs(delta)); warnings += w + mode, w = _clamp("mode", mode); warnings += w + roughness, w = _clamp("roughness", roughness); warnings += w + + icf_core = os.path.join(os.path.dirname(os.path.abspath(__file__)), "icf_core.py") + command = [ + sys.executable, icf_core, + f"--R0={R0}", f"--v0={v0}", f"--T0={T0}", + f"--M_sh={M_sh}", f"--M_hs={M_hs}", + f"--delta={delta}", f"--mode={mode}", f"--roughness={roughness}" + ] + + try: + result = subprocess.run(command, capture_output=True, text=True, check=True) + return warnings + result.stdout + except subprocess.CalledProcessError as e: + return warnings + f"Simulation failed to integrate (Stiff physics boundaries). Error: {e.stderr}" + +if __name__ == "__main__": + mcp.run() diff --git a/MLExamples/icf_4agent/requirements.txt b/MLExamples/icf_4agent/requirements.txt new file mode 100644 index 00000000..80a572bb --- /dev/null +++ b/MLExamples/icf_4agent/requirements.txt @@ -0,0 +1,8 @@ +pyautogen~=0.2.0 +anthropic +gradio +numpy +scipy +matplotlib +mcp[cli] + diff --git a/MLExamples/icf_4agent/start_app.sh b/MLExamples/icf_4agent/start_app.sh new file mode 100755 index 00000000..00e98c74 --- /dev/null +++ b/MLExamples/icf_4agent/start_app.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +# --- Backend selection --- +# Set to "openai" for local vLLM, "anthropic" for cloud API +#export ICF_API_TYPE="${ICF_API_TYPE:-anthropic}" +export ICF_API_TYPE="${ICF_API_TYPE:-openai}" + +if [ "$ICF_API_TYPE" = "openai" ]; then + # Local vLLM defaults + VLLM_PORT="${ICF_VLLM_PORT:-8000}" + export ICF_EXPLORER_BASE_URL="${ICF_EXPLORER_BASE_URL:-http://localhost:${VLLM_PORT}/v1}" + export ICF_EXPLORER_MODEL="${ICF_EXPLORER_MODEL:-gptoss-20b-hedp}" + export ICF_EXPLORER_API_KEY="${ICF_EXPLORER_API_KEY:-unused}" + export ICF_FRONTIER_BASE_URL="${ICF_FRONTIER_BASE_URL:-http://localhost:${VLLM_PORT}/v1}" + export ICF_FRONTIER_MODEL="${ICF_FRONTIER_MODEL:-gptoss-20b-hedp}" + export ICF_FRONTIER_API_KEY="${ICF_FRONTIER_API_KEY:-unused}" +else + # Anthropic cloud defaults (reads from ANTHROPIC_* env vars) + export ICF_EXPLORER_MODEL="${ICF_EXPLORER_MODEL:-Claude-Sonnet-4.5}" + export ICF_FRONTIER_MODEL="${ICF_FRONTIER_MODEL:-Claude-Sonnet-4.5}" +fi + +echo "Starting ICF Multi-Agent Optimizer" +echo " Backend: $ICF_API_TYPE" +echo " Explorer model: $ICF_EXPLORER_MODEL" +echo " Frontier model: $ICF_FRONTIER_MODEL" +echo "" + +source "$SCRIPT_DIR/aivenv/bin/activate" +exec python3 "$SCRIPT_DIR/app.py" diff --git a/MLExamples/icf_4agent/start_vllm.sh b/MLExamples/icf_4agent/start_vllm.sh new file mode 100755 index 00000000..6b2cb6c6 --- /dev/null +++ b/MLExamples/icf_4agent/start_vllm.sh @@ -0,0 +1,79 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" +CHAT_TEMPLATE="${ICF_VLLM_CHAT_TEMPLATE:-${SCRIPT_DIR}/chatml_simple.jinja}" +MODEL_PATH="${ICF_VLLM_MODEL_PATH:-/shareddata/TPC26/gptoss-20b-hedp.03302026}" +MODEL_NAME="${ICF_VLLM_MODEL_NAME:-gptoss-20b-hedp}" +VLLM_IMAGE_TAR="${ICF_VLLM_IMAGE_TAR:-/shareddata/TPC26/vllm_rocm_nightly_main_20260531.tar}" +VLLM_PORT="${ICF_VLLM_PORT:-8000}" +# XXX JB +#TP_SIZE="${ICF_VLLM_TP_SIZE:-1}" +TP_SIZE="${ICF_VLLM_TP_SIZE:-2}" +# MI355X +#MAX_MODEL_LEN="${ICF_VLLM_MAX_MODEL_LEN:-16384}" +MAX_MODEL_LEN="${ICF_VLLM_MAX_MODEL_LEN:-8192}" + +CONTAINER_RT="podman" +if ! command -v podman &>/dev/null; then + CONTAINER_RT="docker" +fi + +# --- Fix rootless podman on HPC nodes without /run/user writable --- +if [ "$CONTAINER_RT" = "podman" ]; then + _uid=$(id -u) + export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/tmp/podman-run-${_uid}}" + _PODMAN_ROOT="/tmp/podman-root-${_uid}" + _PODMAN_RUNROOT="/tmp/podman-run-${_uid}/containers" + _PODMAN_TMPDIR="/tmp/podman-tmp-${_uid}" + mkdir -p "$XDG_RUNTIME_DIR" "$_PODMAN_ROOT" "$_PODMAN_RUNROOT" "$_PODMAN_TMPDIR" + PODMAN_FLAGS="--root $_PODMAN_ROOT --runroot $_PODMAN_RUNROOT --tmpdir $_PODMAN_TMPDIR --storage-opt ignore_chown_errors=true" +fi + +IMAGE_NAME="vllm_rocm_nightly" + +# Load the image if not already present +if ! $CONTAINER_RT $PODMAN_FLAGS image exists "$IMAGE_NAME" 2>/dev/null; then + echo "Loading vLLM container image from $VLLM_IMAGE_TAR ..." + $CONTAINER_RT $PODMAN_FLAGS load -i "$VLLM_IMAGE_TAR" + LOADED_IMAGE=$($CONTAINER_RT $PODMAN_FLAGS images --format "{{.Repository}}:{{.Tag}}" | head -1) + if [ "$LOADED_IMAGE" != "$IMAGE_NAME" ] && [ -n "$LOADED_IMAGE" ]; then + $CONTAINER_RT $PODMAN_FLAGS tag "$LOADED_IMAGE" "$IMAGE_NAME" + fi + echo "Image loaded as $IMAGE_NAME" +fi + +echo "Starting vLLM server..." +echo " Model: $MODEL_PATH" +echo " Name: $MODEL_NAME" +echo " Port: $VLLM_PORT" +echo " TP: $TP_SIZE" +echo " Runtime: $CONTAINER_RT" +echo "" +echo "Once running, set these env vars for app.py:" +echo " export ICF_EXPLORER_BASE_URL=http://localhost:${VLLM_PORT}/v1" +echo " export ICF_EXPLORER_API_KEY=unused" +echo " export ICF_EXPLORER_MODEL=${MODEL_NAME}" +echo " export ICF_API_TYPE=openai" +echo "" + +exec $CONTAINER_RT $PODMAN_FLAGS run --rm \ + --device /dev/kfd \ + --device /dev/dri \ + --group-add video \ + --ipc=host \ + -v "$(dirname "$MODEL_PATH"):/models:ro" \ + -v "${CHAT_TEMPLATE}:/app/chat_template.jinja:ro" \ + -p "${VLLM_PORT}:8000" \ + --name icf-vllm \ + "$IMAGE_NAME" \ + python -m vllm.entrypoints.openai.api_server \ + --model "/models/$(basename "$MODEL_PATH")" \ + --served-model-name "$MODEL_NAME" \ + --tensor-parallel-size "$TP_SIZE" \ + --max-model-len "$MAX_MODEL_LEN" \ + --gpu-memory-utilization=0.7 \ + --trust-remote-code \ + --chat-template /app/chat_template.jinja \ + --tool-call-parser none \ + --port 8000 diff --git a/MLExamples/zenith/Dockerfile.zenith b/MLExamples/zenith/Dockerfile.zenith new file mode 100644 index 00000000..c2d4e4a9 --- /dev/null +++ b/MLExamples/zenith/Dockerfile.zenith @@ -0,0 +1,312 @@ +# +# { podman build --format docker -f Dockerfile.zenith -t zenith_train_image && podman save -o zenith_train_image.tar zenith_train_image; } 2>&1 | tee build.log +# +# build container image for large-scale training on ROCm +# targetting the MI250X/MI300A (gfx90a/gfx942), HPE slingshot NIC-enabled GPU-GPU RDMA +# over aws-ofi/libfabric/RCCL +# +# Jon Belof, AMD 5/30/2026 +# + +# rocm pytorch base image +ARG TRAIN_BASE_IMAGE="rocm/pytorch:rocm7.2.4_ubuntu24.04_py3.12_pytorch_release_2.10.0" + +# ensure that the packages installed by apt are those that were frozen as of current build date +# improves static reproducibility of the image build process +# format = date to "freeze" (YYYYMMDDTHHMMSSZ) +ARG TRAIN_BASE_SNAPSHOT_ID="20260530T000000Z" + +# single stage build for now +FROM ${TRAIN_BASE_IMAGE} AS builder + +# build targetting the MI250X GPU and MI300A APU +#ARG TRAIN_ARCHS="gfx90a;gfx942" +ARG TRAIN_ARCHS="gfx942" + +# commit hashes and repo urls +ARG CXI_HEADERS_HASH="06f69b003aa362b3137f3e6bcd280f48906eb17c" +ARG CXI_HEADERS_REPO=https://github.com/HewlettPackard/shs-cassini-headers.git + +ARG CXI_DRIVER_HASH="6dba406c11b64b5c1e62cc061e98fd4923008b2c" +ARG CXI_DRIVER_REPO=https://github.com/HewlettPackard/shs-cxi-driver.git + +ARG CXI_LIBCXI_HASH="6a6d13ad8dc8cfd6bfa2573290a7a29d64ec6274" +ARG CXI_LIBCXI_REPO="https://github.com/HewlettPackard/shs-libcxi.git" + +ARG FABRIC_HASH="ff7e78cbbe0e0f6c45a510cccee15e3ba3659b44" +ARG FABRIC_REPO="https://github.com/ofiwg/libfabric.git" + +ARG RCCL_HASH="57e58688f44c77076ad536ef1f6b68741fc6e694" +ARG RCCL_REPO="https://github.com/ROCm/rccl.git" + +ARG OFI_HASH="d28863c12d3d6e8c0c7b3a3caa71fbcbf0dca7a8" +ARG OFI_REPO="https://github.com/aws/aws-ofi-nccl.git" + +#ARG MORI_HASH="2d02c6a9" +#ARG MORI_REPO="https://github.com/ROCm/mori.git" + +ARG FA_HASH="0e60e394" +ARG FA_REPO="https://github.com/Dao-AILab/flash-attention.git" + +ARG AITER_HASH="ccb21de005303eeaa193c48fcff9527886d9ef0e" +ARG AITER_REPO="https://github.com/ROCm/aiter.git" + +ARG BITSANDBYTES_HASH="2177945befb0cf7ec5cfc726649579a361ca6b57" +ARG BITSANDBYTES_REPO="https://github.com/bitsandbytes-foundation/bitsandbytes.git" + +ARG AXOLOTL_HASH="bf19bff277614f3bee4a74983654a425f3e4da00" +ARG AXOLOTL_REPO="https://github.com/axolotl-ai-cloud/axolotl.git" + +# set env variables needed for rocm/hip/torch/nccl +ENV ROCM_VERS="7.2.4" +ENV ROCM_HOME="/opt/rocm-${ROCM_VERS}" +ENV PYTORCH_ROCM_ARCH="${TRAIN_ARCHS}" +ENV BNB_ROCM_ARCH="${TRAIN_ARCHS}" +ENV HIP_FORCE_DEV_KERNARG=1 +ENV HSA_XNACK=1 +ENV HSA_OVERRIDE_CPU_AFFINITY_DEBUG=0 +ENV HSA_ENABLE_SCRATCH_ASYNC_RECLAIM=0 + +# needed for libfabric/ofi +ENV FI_PROVIDER="cxi" +# VNI=1 is what works on tuolumne, SLINGSHOT_VNIS not set on that host +ENV FI_CXI_DEFAULT_VNI=1 +ENV SLINGSHOT_VNIS=1 +ENV SLINGSHOT_SVC_IDS=1 +ENV FI_OFI_RXM_USE_SRX=1 +ENV FI_MR_CACHE_MONITOR=memhooks +ENV FI_CXI_DISABLE_HOST_REGISTER=1 +ENV FI_CXI_OPTIMIZED_GETS=1 +ENV FI_CXI_OPTIMIZED_MRS=0 +ENV FI_CXI_DEFAULT_CQ_SIZE=131072 +ENV FI_CXI_DEFAULT_TX_SIZE=256 +ENV FI_CXI_RDZV_PROTO=alt_read +ENV FI_CXI_RDZV_THRESHOLD=2048 +ENV FI_CXI_RDZV_GET_MIN=2049 +ENV FI_CXI_OFLOW_BUF_SIZE=2MB +ENV FI_CXI_ATS=0 +ENV FI_CXI_ODP=0 +#ENV FI_CXI_RX_MATCH_MODE=hybrid +ENV FI_CXI_RX_MATCH_MODE=software +ENV FI_CXI_XPMEM=0 +ENV FI_HMEM_ROCR_ENABLE=1 +ENV FI_HMEM_CUDA_USE_X_PROXIES=0 +ENV FI_HMEM_ROCR_USE_DMABUF=1 +ENV FI_SHM_XPMEM=0 +ENV FI_MR_CACHE_MONITOR=rocr +ENV OFI_NCCL_PLATFORM=cray +ENV OFI_NCCL_PROTOCOL=rdma + +# RCCL tuning +ENV NCCL_DMABUF_ENABLE=1 +ENV NCCL_MIN_NCHANNELS=112 +ENV NCCL_TUNER_PLUGIN=/opt/aws-ofi-rccl/lib/libnccl-ofi-tuner.so +ENV NCCL_NET_PLUGIN_PATH=/opt/aws-ofi-rccl/lib +ENV NCCL_NET_GDR_LEVEL=3 +ENV NCCL_COMM_BLOCKING=0 +ENV NCCL_CROSS_TP_TIMEOUT=1200 +ENV NCCL_P2P_DISABLE=1 +ENV NCCL_IB_DISABLE=1 +ENV NCCL_TIMEOUT=3600000 +ENV NCCL_IGNORE_CPU_AFFINITY=1 +ENV NCCL_IGNORE_CPU_AFFINITY=1 +ENV DISTRIBUTED_TIMEOUT=7200 + +# ray settings +ENV RAY_EXPERIMENTAL_NOSET_HIP_VISIBLE_DEVICES=1 +ENV RAY_memory_usage_threshold=0.99 +ENV RAY_gcs_rpc_server_reconnect_timeout_s=600 +ENV RAY_num_heartbeats_timeout=600 +ENV RAY_TRAIN_WORKER_NOT_READY_TIMEOUT_S=1200 +ENV RAY_ACCEL_ENV_VAR_OVERRIDE_ON_ZERO=0 +ENV RAY_LOG_LEVEL=error +ENV RAY_STATE_LOG_LEVEL=error +ENV RAY_DEDUP_LOGS=0 +ENV RAY_TRAIN_ENABLE_STATE_TRACKING=0 +ENV RAY_TRAIN_ENABLE_PLACEMENT_GROUP_CLEANER=0 +ENV RAY_RAYLET_LOG_LEVEL=error +ENV RAY_DEDUP_LOGS=1 +ENV RAY_CHDIR_TO_TRIAL_DIR=0 +ENV RAY_IGNORE_UNHANDLED_ERRORS=1 +ENV RAY_PRINT_ALL_WORKER_LOGS=0 + +# pytorch settings +ENV TORCH_BLAS_PREFER_HIPBLASLT=1 +ENV TORCH_NCCL_BLOCKING_WAIT=1 +ENV TORCH_NCCL_ASYNC_ERROR_HANDLING=1 +ENV TORCH_NCCL_ASYNC_ERROR_HANDLING=1 +ENV TORCHAO_SKIP_CPP_EXT=1 + +# turn off axolotl telemetery +ENV AXOLOTL_DO_NOT_TRACK=1 +ENV DO_NOT_TRACK=1 +ENV ACCELERATE_DISABLE_RICH=1 +ENV AXOLOTL_USE_KERNELS=1 +ENV PYTHONWARNINGS="ignore" + +# misc python library configs +ENV CURL_CA_BUNDLE="" +ENV PYTHONHTTPSVERIFY=0 +ENV ACCELERATE_SKIP_KERNEL_CHECK=1 +ENV ACCELERATE_USE_FLASH_ATTENTION_2=true +ENV TRANSFORMERS_OFFLINE=1 +ENV TRANSFORMERS_VERBOSITY="error" +ENV TRANSFORMERS_OK_TO_USE_HUB_KERNELS=0 +ENV HF_HUB_OFFLINE=1 +ENV TORCHAO_SKIP_VERSION_CHECK=1 +ENV TRL_SKIP_VERSION_CHECK=1 +ENV KERNELS_OFFLINE=1 +ENV KERNELS_VERBOSITY="error" +ENV NUMEXPR_MAX_THREADS=96 +ENV TRITON_OFFLINE=1 +ENV TRITON_CACHE_DIR=/app/models/.triton_cache + +# runtime shared lib path +ENV LD_LIBRARY_PATH=/opt/venv/lib/python3.12/site-packages/torch/lib:/opt/aws-ofi-rccl/lib:/opt/libfabric/lib:/opt/libcxi/lib:$ROCM_HOME/lib:/usr/local/lib:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu + +# have to remove _apt user or else run into uid problems with apt-get on rootless podman +# these are various dependencies needed for what follows +RUN cp /etc/passwd /etc/passwd.orig \ + && sed "/^_apt/d" /etc/passwd > /etc/passwd.new \ + && mv /etc/passwd.new /etc/passwd \ + && apt-get update -o "Acquire::https::Verify-Peer=false" --snapshot "$TRAIN_BASE_SNAPSHOT_ID" \ + && apt-get install -o "Acquire::https::Verify-Peer=false" -y --no-install-recommends --snapshot "$TRAIN_BASE_SNAPSHOT_ID" autoconf libtool mpich libmpich-dev libconfig-dev libuv1 libuv1-dev fuse libfuse-dev libyaml-dev libnl-3-dev libnl-genl-3-dev udev lm-sensors libsensors-dev cmake rocm-cmake libibverbs-dev libpci-dev libcurl4-openssl-dev libjson-c-dev libhwloc-dev vim \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# operate here for our building +WORKDIR /tmp + +# for some reason, this ubuntu image is missing ROCm torchao :( +RUN pip install --no-deps --pre torchao --index-url https://download.pytorch.org/whl/nightly/rocm7.2 + +# cxi headers +RUN git clone "$CXI_HEADERS_REPO" \ + && cd shs-cassini-headers \ + && git checkout "$CXI_HEADERS_HASH" \ + && cp -r include/* /usr/include \ + && cp -r share/cassini-headers /usr/share/ + +# build cxi driver +RUN git clone "$CXI_DRIVER_REPO" \ + && cd shs-cxi-driver \ + && git checkout "$CXI_DRIVER_HASH" \ + && cp -r include/* /usr/include + +# build libcxi +RUN git clone "$CXI_LIBCXI_REPO" \ + && cd shs-libcxi \ + && git checkout "$CXI_LIBCXI_HASH" \ + && mkdir /usr/include/libcxi \ + && cp -r include/* /usr/include/libcxi/ \ + && ./autogen.sh \ + && LIBUV_CFLAGS="-L/usr/lib/x86_64-linux-gnu" LIBFUSE_CFLAGS="-D_FILE_OFFSET_BITS=64 -I/usr/include/" ./configure --prefix=/opt/libcxi \ + && make -j $(nproc) install + +# install libfabric +RUN rm -f /usr/lib/x86_64-linux-gnu/libfabric* +RUN git clone "$FABRIC_REPO" \ + && cd libfabric \ + && git checkout "$FABRIC_HASH" \ + && ./autogen.sh \ + && LDFLAGS="-L/opt/libcxi/lib -L$ROCM_HOME/lib -Wl,-rpath,/opt/libcxi/lib" \ + CPPFLAGS="-I/opt/libcxi/include -I$ROCM_HOME/include" \ + ./configure --prefix=/opt/libfabric --with-rocr="$ROCM_HOME" \ + --enable-cxi --enable-mrail --enable-rxm \ + && make -j $(nproc) install + +# install RCCL +#RUN git clone "$RCCL_REPO" \ +# && cd rccl \ +# && git checkout "$RCCL_HASH" \ +# && cp -r ./src/include/* /opt/$ROCM_HOME/include/ \ +# && mkdir build \ +# && cd build \ +# && CXX=$ROCM_HOME/bin/hipcc cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$ROCM_HOME -DGPU_TARGETS="$TRAIN_ARCHS" .. +# && make -j $(nproc) install +# && cd $ROCM_HOME/include/rccl \ +# && ln -sf rccl.h nccl.h \ +# && ln -sf rccl.h nccl_common.h \ +# && ln -sf rccl_net.h nccl_net.h + +# install AWS OFI (needs access to libfabric and rccl builds) +RUN git clone "$OFI_REPO" \ + && cd aws-ofi-nccl \ + && git checkout "$OFI_HASH" \ + && ./autogen.sh \ + && ./configure --prefix=/opt/aws-ofi-rccl --with-libfabric=/opt/libfabric --with-rocm=$ROCM_HOME \ + CPPFLAGS="-I$ROCM_HOME/include -I$ROCM_HOME/include/rccl -I/usr/include/x86_64-linux-gnu/mpich" \ + LDFLAGS="-L$ROCM_HOME/lib -L/opt/libfabric/lib -L/opt/libcxi/lib" \ + && make -j $(nproc) install \ + && ln -sf /opt/aws-ofi-rccl/lib/librccl-net.so /opt/aws-ofi-rccl/lib/libnccl-net.so + +# install MORI +#RUN git clone ${MORI_REPO} \ +# && cd mori \ +# && git checkout ${MORI_HASH} \ +# && git submodule update --init --recursive \ +# && pip install --no-cache-dir wheel setuptools_scm \ +# && pip wheel . --wheel-dir=dist --no-deps --no-build-isolation \ +# && pip install --root-user-action=ignore --no-cache-dir dist/*.whl + +# build flash attention 2 +RUN git clone ${FA_REPO} \ + && cd flash-attention \ + && git checkout ${FA_HASH} \ + && git submodule update --init \ + && GPU_ARCHS=$(echo ${TRAIN_ARCHS} | sed -e 's/;gfx1[0-9]\{3\}//g') python setup.py bdist_wheel --dist-dir=dist \ + && pip install --root-user-action=ignore --no-cache-dir dist/*.whl + +# build AITER +RUN git clone --recursive ${AITER_REPO} \ + && cd aiter \ + && git checkout ${AITER_HASH} \ + && git submodule update --init --recursive \ + && pip install -r requirements.txt +RUN pip install pyyaml && cd aiter \ + && AITER_USE_SYSTEM_TRITON=1 GPU_ARCHS=${TRAIN_ARCHS} python setup.py bdist_wheel --dist-dir=dist \ + && pip install --root-user-action=ignore --no-cache-dir dist/*.whl + +# install our frozen axolotl dependencies + ray.train +COPY requirements.txt . + +# dynamically constrain pip to the currently installed ROCm-specific ones in pytorch image +RUN pip freeze | grep -iE "^(torch|torchvision|torchaudio|triton|flash-attn|xformers|deepspeed)==|rocm" > /tmp/constraints.txt && \ + pip install -r requirements.txt \ + -c /tmp/constraints.txt \ + --root-user-action=ignore \ + --no-cache-dir \ + --extra-index-url https://download.pytorch.org/whl/rocm7.2 + +# bitsandbytes for ROCm +RUN git clone "$BITSANDBYTES_REPO" \ + && cd bitsandbytes \ + && git checkout "$BITSANDBYTES_HASH" \ + && cmake -DCOMPUTE_BACKEND=hip -DBNB_ROCM_ARCH="$TRAIN_ARCHS" -S . \ + && make -j 96 \ + && pip install --root-user-action=ignore --no-cache-dir . \ + #&& cd /opt/venv/lib/python3.13/site-packages/bitsandbytes \ + && cd /opt/venv/lib/python3.12/site-packages/bitsandbytes \ + && ln -sf libbitsandbytes_hip.so libbitsandbytes_rocm72.so + +# build axolotl without touching the existing torch/flash-attn +RUN git clone "$AXOLOTL_REPO" \ + && cd axolotl \ + && git checkout "$AXOLOTL_HASH" \ + && pip install --no-deps --root-user-action=ignore . \ + && pip install --no-deps "cut-cross-entropy[transformers] @ git+https://github.com/axolotl-ai-cloud/ml-cross-entropy.git@63b15e6" + +# run install once more to ensure HIP version is there (unsure why this step seems necessary) +RUN cd /tmp/bitsandbytes \ + && pip install --root-user-action=ignore --no-cache-dir . + + +# work space for execution +WORKDIR /app + +# set runtime shared lib path again, just in case one of the previous package installs modified it +ENV LD_LIBRARY_PATH=/opt/venv/lib/python3.12/site-packages/torch/lib:/opt/aws-ofi-rccl/lib:/opt/libfabric/lib:/opt/libcxi/lib:$ROCM_HOME/lib:/usr/local/lib:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu + +# user entry point +CMD ["/bin/bash"] + diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_basics.json b/MLExamples/zenith/SFT_HEDP_dataset/hedp_basics.json new file mode 100644 index 00000000..2075f8ba --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_basics.json @@ -0,0 +1,34 @@ +[ + { + "conversations": [ + {"from": "human", "value": "A laser-driven shock is moving through a plastic ablator (CH) with an initial density of $\\rho_0 = 1.05$ g/cm³. If the shock velocity $u_s$ is measured at 40 km/s, estimate the post-shock pressure $P$ using the strong shock limit for a $\\gamma = 5/3$ gas."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Identify Physics**: We are in the strong shock regime where $P_2 \gg P_1$. The pressure behind the shock is given by $P = \frac{2}{\gamma + 1} \rho_0 u_s^2$.\n2. **Parameters**: $\\gamma = 5/3 \Rightarrow \frac{2}{\\gamma + 1} = \frac{2}{8/3} = 0.75$. \n3. **Unit Conversion**: $u_s = 40 \text{ km/s} = 4 \times 10^6 \text{ cm/s}$. $\\rho_0 = 1.05 \text{ g/cm}^3$.\n4. **Calculation**: $P = 0.75 \times 1.05 \times (4 \times 10^6)^2 = 0.7875 \times 1.6 \times 10^{13} \text{ barye}$.\n5. **Pressure Conversion**: $1 \text{ Mbar} = 10^{12} \text{ barye}$. So $P \approx 12.6 \text{ Mbar}$.\n\n### Final Answer\nThe post-shock pressure is approximately **12.6 Mbar**. This value is typical for the first shock in an ICF ignition capsule pulse shape."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain why the Lawson Criterion is significantly harder to achieve in Indirect Drive ICF compared to Magnetic Confinement Fusion (MCF)."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Define Lawson Criterion**: It requires the product of density, temperature, and confinement time ($n T \tau$) to exceed a threshold for ignition.\n2. **Density vs. Time Trade-off**: MCF (e.g., Tokamaks) uses low density ($n \approx 10^{14} \text{ cm}^{-3}$) and long time ($\tau \approx \text{seconds}$). ICF uses extremely high density ($n \approx 10^{25} \text{ cm}^{-3}$) and very short time ($\tau \approx 100 \text{ ps}$).\n3. **Energy Loss Mechanisms**: In Indirect Drive, energy must first be converted from lasers to X-rays in a hohlraum, incurring a ~70-80% energy loss. \n4. **Instabilities**: Rayleigh-Taylor instabilities during the stagnation phase can mix cold ablator material into the hot spot, quenching the burn before the Lawson criterion is met.\n\n### Final Answer\nThe challenge in **Indirect Drive ICF** stems from the extremely short confinement time dictated by the fuel's inertia. Achieving the required triple product requires a near-perfectly spherical compression ($CR > 30$) to reach the necessary temperatures without hydro-instabilities mixing cold fuel into the hot spot, whereas MCF faces challenges with plasma turbulence over much longer timescales."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Calculate the Rosseland mean opacity weighting for a plasma at 100 eV. Where does the weight function $W(u)$ peak?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Define Rosseland Weight**: The Rosseland mean involves a weighting function $W(u) = \frac{\partial B_\nu}{\partial T} / \int \frac{\partial B_\nu}{\partial T} d\nu$, where $u = h\nu / kT$.\n2. **Mathematical Form**: $W(u) = \frac{15}{4\pi^4} \frac{u^4 e^u}{(e^u - 1)^2}$.\n3. **Finding the Peak**: Differentiating $W(u)$ with respect to $u$ and setting to zero yields the maximum around $u \approx 3.83$.\n4. **Energy Peak**: At $T = 100 \text{ eV}$, the energy $h\nu$ that dominates the Rosseland mean is $3.83 \times 100 \text{ eV} = 383 \text{ eV}$.\n\n### Final Answer\nThe Rosseland weight function $W(u)$ peaks at **$u \approx 3.83$**. For a 100 eV plasma, this means the energy transport is most sensitive to the opacity of the plasma near **383 eV** (soft X-rays)."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the physical significance of the 'Marshak Wave' in HEDP experiments?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Context**: Radiation transport in optically thick media.\n2. **Definition**: A Marshak wave is a non-linear thermal wave where radiation energy density dominates over matter energy density.\n3. **Scaling**: The wave front position $x_f$ scales as $\sqrt{t}$ in the diffusion limit, but the temperature profile is 'top-hat' shaped rather than Gaussian because opacity typically drops as $T$ increases ($\kappa \propto T^{-3.5}$).\n4. **HEDP Application**: Used to model hohlraum wall heating and the ablation front propagation into the capsule.\n\n### Final Answer\nA **Marshak Wave** represents a supersonic heat front where radiation diffusion drives the temperature change. Unlike a standard shock, it moves without mass motion initially. In ICF, it is the primary mechanism by which laser-produced X-rays heat the capsule ablator."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "In an X-ray Thomson Scattering (XRTS) diagnostic, how do you distinguish between the 'Collective' and 'Non-Collective' regimes?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Scattering Parameter**: Define the alpha parameter $\alpha = 1 / (k \lambda_D)$, where $k$ is the scattering vector and $\lambda_D$ is the Debye length.\n2. **Non-Collective ($\alpha < 1$)**: Occurs when the scattering wavelength is smaller than the Debye length. The spectrum reflects the velocity distribution of individual electrons (Doppler broadening).\n3. **Collective ($\alpha > 1$)**: Occurs when scattering off density fluctuations larger than the Debye length. The spectrum shows 'plasmons' (ion-acoustic and electron-plasma frequency peaks).\n\n### Final Answer\nThe transition occurs at **$\alpha = 1$**. In the **Collective regime ($\alpha > 1$)**, the signal reveals plasma oscillations and correlations, whereas in the **Non-Collective regime ($\alpha < 1$)**, the signal directly measures the electron temperature $T_e$ via the shape of the Compton-scattered peak."} + ] + } +] + + diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_darkstar_rmi.json b/MLExamples/zenith/SFT_HEDP_dataset/hedp_darkstar_rmi.json new file mode 100644 index 00000000..3a769a09 --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_darkstar_rmi.json @@ -0,0 +1,65 @@ + +[ + { + "conversations": [ + {"from": "human", "value": "In the work of Sterbentz et al., how is 'Topology Optimization' combined with ML to mitigate RMI in ICF capsules?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **RMI Trigger**: RMI occurs when a shock wave passes through an interface with density perturbations.\n2. **Optimization Goal**: Find an interface shape that produces 'phase inversion' or interference to cancel out growth.\n3. **ML Role**: Traditional adjoint-based optimization is slow. Sterbentz uses ML surrogate models to rapidly evaluate millions of micro-topologies (e.g., 'sinusoidal' vs. 'random' roughness) to find the specific geometry that minimizes late-time mix mass.\n\n### Final Answer\n**Topology Optimization** is used to 'engineer' the interface. Sterbentz and Belof demonstrate that by using ML to explore the design space, they can identify **non-intuitive surface perturbations** that use the impulsive shock of the RMI to actually 'smooth' the interface via phase-reversal, rather than letting it grow into turbulent jets."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the significance of 'Shock-Timing Surrogates' in the suppression of RMI during the first-picket phase?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **The Picket**: The first laser pulse sends the initial shock.\n2. **RMI Seeding**: This shock seeds the RMI at the ablator-ice interface.\n3. **ML Application**: LLNL researchers use ML surrogates to predict the 'impulse' delivered by the shock. By tuning the picket shape so the shock hits the interface at a specific 'null point' of the surface perturbation, RMI growth can be significantly reduced.\n\n### Final Answer\n**Shock-Timing Surrogates** allow for the precise alignment of the shock arrival with the state of the interface. In Belof's framework, ML models predict the **impulsive velocity jump ($\Delta v$)** across the interface, allowing designers to tune the laser pulse to ensure that the initial RMI seeding is minimized or even negated through destructive interference."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "How does the 'DarkStar' framework handle the multi-modal nature of RMI growth compared to traditional 1D models?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **1D Limitation**: Standard codes often use a single 'mix width' parameter.\n2. **Multi-modal RMI**: Real interfaces have a spectrum of wavelengths ($k$).\n3. **DarkStar Approach**: Uses Deep Neural Networks (DNNs) to model the mode-coupling of different wavelengths. This allows the code to predict how small-scale 'ripples' feed energy into large-scale 'jets.'\n\n### Final Answer\n**DarkStar** moves beyond 1D 'mix' constants by using ML to capture **mode-coupling**. Because RMI growth depends on the interaction of multiple surface wavelengths, DarkStar’s DNNs are trained to predict how energy transfers between modes, providing a more accurate prediction of shell integrity than any standard analytical model."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Define 'Deep Adaptive Design' as used by Sterbentz to manage RMI in HEDP experiments."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Adaptive Design**: Changing the experiment based on previous results.\n2. **Deep Integration**: Using a Deep Learning model as the 'brain' of the loop.\n3. **RMI Context**: The AI looks at the RMI growth from a 'calibration' shot and immediately suggests a specific 'correction' to the next capsule's surface finish to cancel out the observed instability.\n\n### Final Answer\n**Deep Adaptive Design** is an iterative ML strategy that 'learns' from each experiment. Sterbentz applies this to **RMI management** by using the AI to suggest real-time modifications to target manufacturing, ensuring that the next iteration of the capsule is specifically 'anti-correlated' to the observed instability growth of the previous shot."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "How does ML identify the 'Phase Inversion' threshold for a shocked interface?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Physics**: When a shock passes from a light to a heavy medium (or vice versa), the RMI perturbation can 'flip' its sign.\n2. **Threshold**: The exact timing/strength needed for perfect inversion is sensitive.\n3. **ML Role**: Classification models (like SVMs or CNNs) are trained to identify the 'Inversion Boundary' in the pressure-density-wavelength parameter space.\n\n### Final Answer\nML models are used to map the **Phase Inversion Boundary**. By identifying the exact conditions under which an RMI-seeded perturbation will 'zero out' during its oscillation, the AI helps designers choose a **'Stability Sweet Spot'** where the shock-interface interaction actually helps maintain a spherical shell rather than destroying it."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What role do 'Convolutional Autoencoders' play in analyzing the 'Bubble-to-Spike' ratio in RMI simulations?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Asymmetry**: RMI creates light 'bubbles' and heavy 'spikes.'\n2. **Diagnostic**: The ratio of these structures tells us about the non-linearity of the growth.\n3. **ML Task**: Use an Autoencoder to compress the simulation image and extract a 'Morphology Vector' that quantifies the spike sharpness.\n\n### Final Answer\n**Convolutional Autoencoders** are used to quantify **instability morphology**. In RMI studies led by Belof, these models extract the 'Bubble-to-Spike' ratio from 2D/3D data, allowing for a high-throughput comparison between designs to see which specific capsule configurations prevent the formation of the sharp 'spikes' that typically lead to fuel contamination."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Describe the 'Latent Space Optimization' (LSO) approach for RMI-resistant ablator designs."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Complex Inputs**: Ablator design involves dopants, thickness, and surface finish.\n2. **LSO**: Use a Variational Autoencoder (VAE) to create a 'latent space' of designs.\n3. **Search**: Perform a gradient-based search in this simplified 10D space to find the 'RMI minimum.'\n\n### Final Answer\n**Latent Space Optimization (LSO)** simplifies the search for stable targets. By mapping thousands of high-Z and low-Z ablator configurations into a compressed **latent manifold**, Sterbentz can use ML to discover 'hybrid' ablator structures that possess unique density gradients capable of damping RMI shocks across a wide range of laser energies."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "How does 'Ensemble Learning' improve the prediction of the 'RMI-to-Turbulence' transition?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Uncertainty**: The moment RMI goes from linear to turbulent mix is highly stochastic.\n2. **Ensemble**: Combining multiple ML models (e.g., Random Forest + MLP + Gradient Boosting).\n3. **Benefit**: If all models agree on the transition point, the confidence is high.\n\n### Final Answer\n**Ensemble Learning** provides a robust 'consensus' on the onset of **turbulent mix**. In the work of LLNL and CEA, ensembles are used to predict the critical Reynolds number at which RMI growth becomes chaotic, allowing designers to ensure that the capsule stagnates *before* this transition occurs, preserving the 'hotspot' purity."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the 'Multi-Fidelity' training approach for RMI surrogate models?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Fidelities**: 1D (fast/cheap), 2D (medium), 3D (slow/expensive).\n2. **Training**: Train the base model on millions of 1D shots; use 2D/3D shots to 'correct' the model's spatial intuition.\n3. **RMI Context**: 1D can't see 'jets,' but 2D can. The model 'learns' the 2D correction factor.\n\n### Final Answer\nThe **Multi-Fidelity approach** maximizes the value of expensive data. By pre-training on millions of 1D simulations and 'fine-tuning' with high-resolution 3D RMI simulations, Belof’s surrogates gain the ability to predict **three-dimensional jetting behavior** with the speed of a one-dimensional calculation."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "In the 'Digital Twin' for NIF, how is 'Bayesian Neural Networks' (BNNs) used to assess RMI risk?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **BNN**: A neural network that provides a 'probability distribution' instead of a single number.\n2. **Risk Assessment**: If the BNN says the mix mass is $10 \mu g \pm 5 \mu g$, the risk is high.\n3. **Decision**: Designers use this 'Uncertainty' to decide if a capsule is safe to shoot.\n\n### Final Answer\n**Bayesian Neural Networks (BNNs)** are used for **Risk Quantification**. Unlike standard AI, BNNs provide a 'confidence interval' for the predicted RMI growth; if the uncertainty is too high, the 'Digital Twin' flags the target for further metrology, ensuring that no shot is taken without a clear understanding of the instability risk."} + ] + } +] + + diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_dataset.jsonl b/MLExamples/zenith/SFT_HEDP_dataset/hedp_dataset.jsonl new file mode 100644 index 00000000..b5e8c2b3 --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_dataset.jsonl @@ -0,0 +1,149 @@ +{"conversations": [{"from": "human", "value": "Explain why the Lawson Criterion is significantly harder to achieve in Indirect Drive ICF compared to Magnetic Confinement Fusion (MCF)."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Define Lawson Criterion**: It requires the product of density, temperature, and confinement time ($n T \tau$) to exceed a threshold for ignition.\n2. **Density vs. Time Trade-off**: MCF (e.g., Tokamaks) uses low density ($n \\\\approx 10^{14} \text{ cm}^{-3}$) and long time ($\tau \\\\approx \text{seconds}$). ICF uses extremely high density ($n \\\\approx 10^{25} \text{ cm}^{-3}$) and very short time ($\tau \\\\approx 100 \text{ ps}$).\n3. **Energy Loss Mechanisms**: In Indirect Drive, energy must first be converted from lasers to X-rays in a hohlraum, incurring a ~70-80% energy loss. \n4. **Instabilities**: Rayleigh-Taylor instabilities during the stagnation phase can mix cold ablator material into the hot spot, quenching the burn before the Lawson criterion is met.\n\n### Final Answer\nThe challenge in **Indirect Drive ICF** stems from the extremely short confinement time dictated by the fuel's inertia. Achieving the required triple product requires a near-perfectly spherical compression ($CR > 30$) to reach the necessary temperatures without hydro-instabilities mixing cold fuel into the hot spot, whereas MCF faces challenges with plasma turbulence over much longer timescales."}]} +{"conversations": [{"from": "human", "value": "Calculate the Rosseland mean opacity weighting for a plasma at 100 eV. Where does the weight function $W(u)$ peak?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Define Rosseland Weight**: The Rosseland mean involves a weighting function $W(u) = \frac{\\\\partial B_\nu}{\\\\partial T} / \\\\int \frac{\\\\partial B_\nu}{\\\\partial T} d\nu$, where $u = h\nu / kT$.\n2. **Mathematical Form**: $W(u) = \frac{15}{4\\\\pi^4} \frac{u^4 e^u}{(e^u - 1)^2}$.\n3. **Finding the Peak**: Differentiating $W(u)$ with respect to $u$ and setting to zero yields the maximum around $u \\\\approx 3.83$.\n4. **Energy Peak**: At $T = 100 \text{ eV}$, the energy $h\nu$ that dominates the Rosseland mean is $3.83 \times 100 \text{ eV} = 383 \text{ eV}$.\n\n### Final Answer\nThe Rosseland weight function $W(u)$ peaks at **$u \\\\approx 3.83$**. For a 100 eV plasma, this means the energy transport is most sensitive to the opacity of the plasma near **383 eV** (soft X-rays)."}]} +{"conversations": [{"from": "human", "value": "What is the physical significance of the 'Marshak Wave' in HEDP experiments?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Context**: Radiation transport in optically thick media.\n2. **Definition**: A Marshak wave is a non-linear thermal wave where radiation energy density dominates over matter energy density.\n3. **Scaling**: The wave front position $x_f$ scales as $\\\\sqrt{t}$ in the diffusion limit, but the temperature profile is 'top-hat' shaped rather than Gaussian because opacity typically drops as $T$ increases ($\\\\kappa \\\\propto T^{-3.5}$).\n4. **HEDP Application**: Used to model hohlraum wall heating and the ablation front propagation into the capsule.\n\n### Final Answer\nA **Marshak Wave** represents a supersonic heat front where radiation diffusion drives the temperature change. Unlike a standard shock, it moves without mass motion initially. In ICF, it is the primary mechanism by which laser-produced X-rays heat the capsule ablator."}]} +{"conversations": [{"from": "human", "value": "In an X-ray Thomson Scattering (XRTS) diagnostic, how do you distinguish between the 'Collective' and 'Non-Collective' regimes?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Scattering Parameter**: Define the alpha parameter $\\\\alpha = 1 / (k \\\\lambda_D)$, where $k$ is the scattering vector and $\\\\lambda_D$ is the Debye length.\n2. **Non-Collective ($\\\\alpha < 1$)**: Occurs when the scattering wavelength is smaller than the Debye length. The spectrum reflects the velocity distribution of individual electrons (Doppler broadening).\n3. **Collective ($\\\\alpha > 1$)**: Occurs when scattering off density fluctuations larger than the Debye length. The spectrum shows 'plasmons' (ion-acoustic and electron-plasma frequency peaks).\n\n### Final Answer\nThe transition occurs at **$\\\\alpha = 1$**. In the **Collective regime ($\\\\alpha > 1$)**, the signal reveals plasma oscillations and correlations, whereas in the **Non-Collective regime ($\\\\alpha < 1$)**, the signal directly measures the electron temperature $T_e$ via the shape of the Compton-scattered peak."}]} +{"conversations": [{"from": "human", "value": "What is the significance of 'Shock-Timing Surrogates' in the suppression of RMI during the first-picket phase?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Picket**: The first laser pulse sends the initial shock.\n2. **RMI Seeding**: This shock seeds the RMI at the ablator-ice interface.\n3. **ML Application**: LLNL researchers use ML surrogates to predict the 'impulse' delivered by the shock. By tuning the picket shape so the shock hits the interface at a specific 'null point' of the surface perturbation, RMI growth can be significantly reduced.\n\n### Final Answer\n**Shock-Timing Surrogates** allow for the precise alignment of the shock arrival with the state of the interface. In Belof's framework, ML models predict the **impulsive velocity jump ($\\\\Delta v$)** across the interface, allowing designers to tune the laser pulse to ensure that the initial RMI seeding is minimized or even negated through destructive interference."}]} +{"conversations": [{"from": "human", "value": "How does the 'DarkStar' framework handle the multi-modal nature of RMI growth compared to traditional 1D models?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **1D Limitation**: Standard codes often use a single 'mix width' parameter.\n2. **Multi-modal RMI**: Real interfaces have a spectrum of wavelengths ($k$).\n3. **DarkStar Approach**: Uses Deep Neural Networks (DNNs) to model the mode-coupling of different wavelengths. This allows the code to predict how small-scale 'ripples' feed energy into large-scale 'jets.'\n\n### Final Answer\n**DarkStar** moves beyond 1D 'mix' constants by using ML to capture **mode-coupling**. Because RMI growth depends on the interaction of multiple surface wavelengths, DarkStar\u2019s DNNs are trained to predict how energy transfers between modes, providing a more accurate prediction of shell integrity than any standard analytical model."}]} +{"conversations": [{"from": "human", "value": "Define 'Deep Adaptive Design' as used by Sterbentz to manage RMI in HEDP experiments."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Adaptive Design**: Changing the experiment based on previous results.\n2. **Deep Integration**: Using a Deep Learning model as the 'brain' of the loop.\n3. **RMI Context**: The AI looks at the RMI growth from a 'calibration' shot and immediately suggests a specific 'correction' to the next capsule's surface finish to cancel out the observed instability.\n\n### Final Answer\n**Deep Adaptive Design** is an iterative ML strategy that 'learns' from each experiment. Sterbentz applies this to **RMI management** by using the AI to suggest real-time modifications to target manufacturing, ensuring that the next iteration of the capsule is specifically 'anti-correlated' to the observed instability growth of the previous shot."}]} +{"conversations": [{"from": "human", "value": "How does ML identify the 'Phase Inversion' threshold for a shocked interface?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Physics**: When a shock passes from a light to a heavy medium (or vice versa), the RMI perturbation can 'flip' its sign.\n2. **Threshold**: The exact timing/strength needed for perfect inversion is sensitive.\n3. **ML Role**: Classification models (like SVMs or CNNs) are trained to identify the 'Inversion Boundary' in the pressure-density-wavelength parameter space.\n\n### Final Answer\nML models are used to map the **Phase Inversion Boundary**. By identifying the exact conditions under which an RMI-seeded perturbation will 'zero out' during its oscillation, the AI helps designers choose a **'Stability Sweet Spot'** where the shock-interface interaction actually helps maintain a spherical shell rather than destroying it."}]} +{"conversations": [{"from": "human", "value": "What role do 'Convolutional Autoencoders' play in analyzing the 'Bubble-to-Spike' ratio in RMI simulations?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Asymmetry**: RMI creates light 'bubbles' and heavy 'spikes.'\n2. **Diagnostic**: The ratio of these structures tells us about the non-linearity of the growth.\n3. **ML Task**: Use an Autoencoder to compress the simulation image and extract a 'Morphology Vector' that quantifies the spike sharpness.\n\n### Final Answer\n**Convolutional Autoencoders** are used to quantify **instability morphology**. In RMI studies led by Belof, these models extract the 'Bubble-to-Spike' ratio from 2D/3D data, allowing for a high-throughput comparison between designs to see which specific capsule configurations prevent the formation of the sharp 'spikes' that typically lead to fuel contamination."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Latent Space Optimization' (LSO) approach for RMI-resistant ablator designs."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Complex Inputs**: Ablator design involves dopants, thickness, and surface finish.\n2. **LSO**: Use a Variational Autoencoder (VAE) to create a 'latent space' of designs.\n3. **Search**: Perform a gradient-based search in this simplified 10D space to find the 'RMI minimum.'\n\n### Final Answer\n**Latent Space Optimization (LSO)** simplifies the search for stable targets. By mapping thousands of high-Z and low-Z ablator configurations into a compressed **latent manifold**, Sterbentz can use ML to discover 'hybrid' ablator structures that possess unique density gradients capable of damping RMI shocks across a wide range of laser energies."}]} +{"conversations": [{"from": "human", "value": "How does 'Ensemble Learning' improve the prediction of the 'RMI-to-Turbulence' transition?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Uncertainty**: The moment RMI goes from linear to turbulent mix is highly stochastic.\n2. **Ensemble**: Combining multiple ML models (e.g., Random Forest + MLP + Gradient Boosting).\n3. **Benefit**: If all models agree on the transition point, the confidence is high.\n\n### Final Answer\n**Ensemble Learning** provides a robust 'consensus' on the onset of **turbulent mix**. In the work of LLNL and CEA, ensembles are used to predict the critical Reynolds number at which RMI growth becomes chaotic, allowing designers to ensure that the capsule stagnates *before* this transition occurs, preserving the 'hotspot' purity."}]} +{"conversations": [{"from": "human", "value": "What is the 'Multi-Fidelity' training approach for RMI surrogate models?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Fidelities**: 1D (fast/cheap), 2D (medium), 3D (slow/expensive).\n2. **Training**: Train the base model on millions of 1D shots; use 2D/3D shots to 'correct' the model's spatial intuition.\n3. **RMI Context**: 1D can't see 'jets,' but 2D can. The model 'learns' the 2D correction factor.\n\n### Final Answer\nThe **Multi-Fidelity approach** maximizes the value of expensive data. By pre-training on millions of 1D simulations and 'fine-tuning' with high-resolution 3D RMI simulations, Belof\u2019s surrogates gain the ability to predict **three-dimensional jetting behavior** with the speed of a one-dimensional calculation."}]} +{"conversations": [{"from": "human", "value": "In the 'Digital Twin' for NIF, how is 'Bayesian Neural Networks' (BNNs) used to assess RMI risk?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **BNN**: A neural network that provides a 'probability distribution' instead of a single number.\n2. **Risk Assessment**: If the BNN says the mix mass is $10 \\\\mu g \\\\pm 5 \\\\mu g$, the risk is high.\n3. **Decision**: Designers use this 'Uncertainty' to decide if a capsule is safe to shoot.\n\n### Final Answer\n**Bayesian Neural Networks (BNNs)** are used for **Risk Quantification**. Unlike standard AI, BNNs provide a 'confidence interval' for the predicted RMI growth; if the uncertainty is too high, the 'Digital Twin' flags the target for further metrology, ensuring that no shot is taken without a clear understanding of the instability risk."}]} +{"conversations": [{"from": "human", "value": "Derive the shock compression limit for an ideal monatomic gas ($\\\\gamma = 5/3$) using the Rankine-Hugoniot relations."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Rankine-Hugoniot Density Ratio**: The ratio of post-shock density $\rho_2$ to initial density $\rho_1$ is given by:\n $$\frac{\rho_2}{\rho_1} = \frac{(\\\\gamma+1)M^2}{(\\\\gamma-1)M^2 + 2}$$\n2. **Strong Shock Limit**: For HEDP, the Mach number $M \to \\\\infty$.\n3. **Simplify**: As $M^2$ becomes very large, the constant '2' in the denominator becomes negligible.\n $$\frac{\rho_2}{\rho_1} \to \frac{\\\\gamma+1}{\\\\gamma-1}$$\n4. **Substitute $\\\\gamma$**: For $\\\\gamma = 5/3$, the ratio is $(5/3 + 1) / (5/3 - 1) = (8/3) / (2/3) = 4$.\n\n### Final Answer\nIn the strong shock limit, an ideal monatomic gas can only be compressed to **4 times** its initial density. This is a fundamental constraint in ICF; to achieve the higher densities needed for ignition (e.g., $1000 \times$ solid density), physicists must use a sequence of carefully timed 'weak' shocks rather than a single strong one to stay on a lower adiabat."}]} +{"conversations": [{"from": "human", "value": "What is the 'Hugoniot Elastic Limit' (HEL) and why is it relevant for planetary science in HEDP?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The HEL is the maximum compressive stress a solid can withstand under one-dimensional shock loading before it transitions from purely elastic to plastic (permanent) deformation.\n2. **Planetary Context**: Deep planetary interiors (like Earth's core or 'Super-Earths') exist at pressures far exceeding the HEL of silicates and iron.\n3. **Experimental Link**: HEDP facilities use 'ramp compression' (non-shock) to keep materials below the HEL or to study the transition precisely without melting the sample.\n\n### Final Answer\nThe **Hugoniot Elastic Limit (HEL)** marks the point where a material's internal strength is overcome by shock pressure. It is critical for planetary science because it determines the state (solid vs. liquid) and structural phase of minerals in planetary mantles. Knowing the HEL allows researchers to interpret seismic data and build accurate models of planetary formation."}]} +{"conversations": [{"from": "human", "value": "A material has a SESAME EOS table entry. What three primary physical components are typically summed to create the total pressure $P_{total}(\rho, T)$ in such tables?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Component 1 (Cold Curve)**: The zero-temperature pressure $P_c(\rho)$ due to interatomic forces at $T=0$.\n2. **Component 2 (Ion Thermal)**: The pressure contribution from the motion of the nuclei (often treated with a Debye or Cowan model).\n3. **Component 3 (Electron Thermal)**: The pressure from the thermal excitation of electrons (often using Thomas-Fermi or similar models).\n4. **Totaling**: $P_{total} = P_{cold}(\rho) + P_{ion\\\\_thermal}(\rho, T) + P_{elec\\\\_thermal}(\rho, T)$.\n\n### Final Answer\nSESAME EOS tables typically sum the **Cold Curve** (elastic pressure), **Ion Thermal** pressure (lattice vibrations), and **Electron Thermal** pressure (excitation/ionization). This modular approach allows the tables to span from cold solid states to hot, fully ionized plasmas."}]} +{"conversations": [{"from": "human", "value": "Define 'Ionization Potential Depression' (IPD) and its effect on the Equation of State in dense plasmas."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: In a dense plasma, the electric fields of neighboring ions and free electrons overlap with a bound electron's nucleus.\n2. **Effect**: This reduces the energy required to ionize an atom compared to an isolated atom in a vacuum.\n3. **Models**: The Stewart-Pyatt or Ecker-Kr\u00f6ll models are commonly used to calculate the shift $\\\\Delta E$.\n4. **EOS Impact**: IPD increases the average ionization state $\\\\langle Z \rangle$ for a given temperature, which directly increases the electronic pressure $P_e = n_e kT$.\n\n### Final Answer\n**Ionization Potential Depression (IPD)** is the lowering of ionization thresholds due to plasma environment effects. In the EOS, it results in 'pressure ionization,' where a material becomes a plasma purely due to high density even at low temperatures, significantly altering the material's compressibility and energy absorption."}]} +{"conversations": [{"from": "human", "value": "What is the purpose of 'Pulse Shaping' (e.g., the picket and the main drive) in an ICF laser shot?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Goal**: Compress the fuel to high density without heating it too much early on (keeping it on a low adiabat).\n2. **The Picket**: A short, early pulse that sets the initial shock. It determines the 'adiabat' ($s$) of the fuel.\n3. **The Trough**: A period of lower power that allows the shock to travel through the ablator.\n4. **The Main Drive**: The final high-power ramp that provides the bulk of the compression.\n5. **Physics**: Proper timing prevents the shocks from coalescing too early, which would cause pre-heating and prevent high compression.\n\n### Final Answer\n**Pulse Shaping** is used to control the entropy (adiabat) of the fuel. By sending a series of timed shocks (the **picket** followed by the **main drive**), physicists can compress the DT fuel while keeping it relatively 'cold' and compressible. If the shocks coalesce at the wrong time, the fuel becomes too hot to reach the densities required for ignition."}]} +{"conversations": [{"from": "human", "value": "Define 'Alpha Heating' and its role in the transition from a burning plasma to ignition."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Fusion Reaction**: $D + T \to {}^4He (3.5 \text{ MeV}) + n (14.1 \text{ MeV})$.\n2. **Alpha Capture**: The neutrons escape the plasma, but the Alpha particles (${}^4He$) are charged and can be stopped by the dense fuel.\n3. **Feedback Loop**: As the Alphas deposit their 3.5 MeV of energy, they heat the fuel further, increasing the fusion rate, which produces more Alphas.\n4. **Ignition Threshold**: Ignition occurs when the power deposited by Alpha heating exceeds all loss mechanisms (radiation, conduction, expansion).\n\n### Final Answer\n**Alpha Heating** is the self-heating mechanism of a fusion plasma where the kinetic energy of helium nuclei (alpha particles) is redeposited into the fuel. It is the 'engine' of ignition; once Alpha heating dominates the energy balance, the fusion process becomes self-sustaining, leading to a massive increase in energy yield."}]} +{"conversations": [{"from": "human", "value": "Why is 'High Density Carbon' (HDC/Diamond) often preferred over Beryllium or CH as an ablator material?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Density**: HDC is much denser than plastic (CH).\n2. **Ablation Pressure**: Higher density leads to higher ablation pressure for a given X-ray drive.\n3. **Pulse Duration**: Because HDC is thinner (due to its density), the laser pulse can be shorter, reducing the time for instabilities like SRS or SBS to grow.\n4. **Trade-off**: HDC is polycrystalline, which can lead to non-uniform shock propagation if not carefully manufactured.\n\n### Final Answer\n**High Density Carbon (HDC)** is preferred because its high mass density allows for a thinner ablator and a shorter laser pulse. This reduces the window for **Laser-Plasma Interactions (LPI)** to degrade the shot and allows for a higher 'implosion velocity,' which is critical for reaching the temperatures needed for DT fusion."}]} +{"conversations": [{"from": "human", "value": "Explain the 'Hohlraum Symmetry' problem. How do 'Cross-Beam Energy Transfer' (CBET) and 'Inner/Outer Beam Ratios' help solve it?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Issue**: To get a spherical implosion, the X-ray flux inside the hohlraum must be perfectly uniform. \n2. **Geometry**: Lasers are divided into 'inner' beams (hitting the waist) and 'outer' beams (hitting the ends).\n3. **CBET**: This is a non-linear process where laser beams crossing at the hohlraum entrance exchange energy.\n4. **Tuning**: By shifting the wavelength of the beams slightly ($\\\\Delta \\\\lambda$), physicists can use CBET to move energy from the outer beams to the inner beams during the shot.\n\n### Final Answer\n**Hohlraum Symmetry** ensures the capsule is squeezed into a sphere rather than a 'pancake' or 'sausage' shape. Since the laser spots move as the hohlraum wall expands, **Cross-Beam Energy Transfer (CBET)** is used as a 'knob' to dynamically redistribute laser power between the inner and outer beams, maintaining a symmetric X-ray drive throughout the pulse."}]} +{"conversations": [{"from": "human", "value": "Explain the significance of the 'Ablator-Fuel Atwood Number' during the deceleration phase of an ICF implosion."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: $A = (\\\\\rho_2 - \\\\\rho_1) / (\\\\\rho_2 + \\\\\rho_1)$.\n2. **Deceleration Phase**: The low-density hotspot (fuel) is pushing against the high-density 'pusher' (remaining ablator/fuel shell).\n3. **Instability Growth**: During this phase, $A$ is positive and points inward, meaning the interface is RT-unstable. A higher Atwood number leads to faster 'spike' penetration of the ablator into the hotspot.\n\n### Final Answer\nThe **Atwood Number** at the ablator-fuel interface determines how quickly 'mix' enters the hotspot during deceleration. In capsule design, materials are chosen to keep this number as low as possible at peak compression to prevent high-Z ablator atoms from quenching the fusion burn."}]} +{"conversations": [{"from": "human", "value": "How does the 'Aspect Ratio' (radius/thickness) of a capsule shell affect its susceptibility to 'Shell Breakup'?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The In-Flight Aspect Ratio (IFAR) is $R / \\\\\\\\Delta R$ during the implosion.\n2. **Efficiency**: Thinner shells (higher IFAR) are easier to accelerate to high velocities.\n3. **Risk**: Thinner shells are more fragile; if RT perturbations grow larger than the shell thickness $\\\\\\\\Delta R$, the shell will 'break up,' causing the implosion to fail.\n\n### Final Answer\nA high **Aspect Ratio (IFAR)** allows for higher implosion velocities but increases the risk of **Shell Breakup**. If the Rayleigh-Taylor instability growth exceeds the shell's thickness, the pusher can no longer effectively contain the hotspot pressure, leading to a failed 'fizzle' shot."}]} +{"conversations": [{"from": "human", "value": "What is the purpose of the 'Hohlraum Gas Fill' (e.g., He or $H_2$) in an indirect-drive ICF design?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Wall Expansion**: When lasers hit the gold hohlraum walls, the gold expands rapidly as a plasma 'blowoff.'\n2. **Stagnation**: If the gold reaches the center too soon, it interferes with the capsule implosion.\n3. **Gas Role**: A low-Z gas fill provides 'tamp' pressure that holds the gold walls back, keeping the hohlraum open for laser propagation throughout the pulse.\n\n### Final Answer\nThe **Hohlraum Gas Fill** is used to **tamp the expansion of the gold walls**. By providing a low-density buffer, it keeps the hohlraum interior clear of high-Z gold plasma, ensuring that the laser beams can reach their target spots throughout the entire duration of the drive pulse."}]} +{"conversations": [{"from": "human", "value": "Compare 'Beryllium' and 'High-Density Carbon' (HDC) as ICF ablators regarding their 'Opacity' and 'Ablation Rate.'"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Beryllium ($Z=4$)**: Lower opacity; X-rays penetrate deeper. This leads to a higher mass-ablation rate but requires longer pulse shapes.\n2. **HDC ($Z=6$)**: Higher opacity; X-rays are absorbed in a thinner layer. This produces higher ablation pressure and allows for shorter pulses.\n3. **Engineering**: Beryllium is difficult to manufacture and toxic, while HDC can be grown as high-quality synthetic diamond.\n\n### Final Answer\n**HDC** has a higher opacity than **Beryllium**, leading to higher ablation pressures and shorter drive requirements. However, Beryllium's lower opacity allows for a smoother ablation front, which can be more stable against certain hydrodynamic instabilities."}]} +{"conversations": [{"from": "human", "value": "What is 'Pre-pulse' and how can it accidentally 'vent' a capsule before the main drive arrives?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Laser Leakage**: Small amounts of laser energy (ASE or leakage) hitting the target before the main pulse.\n2. **Mechanism**: This energy can create a weak shock or evaporate the surface of the ablator.\n3. **Venting**: If the pre-pulse is too strong, it can blow a hole in the capsule or pre-expand the shell, destroying the carefully tuned density profile needed for the main compression.\n\n### Final Answer\n**Pre-pulse** is unwanted laser energy that arrives before the main drive. It can **'vent' or pre-expand the capsule**, causing it to lose its structural integrity or causing the DT fuel to leak out, which prevents the capsule from ever reaching the necessary stagnation pressures."}]} +{"conversations": [{"from": "human", "value": "Explain the role of 'Shock Coalescence' in the DT fuel layer."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Multi-Shock Design**: ICF pulses use 3 or 4 shocks of increasing strength.\n2. **Timing**: Shocks must be timed so they all merge (coalesce) exactly at the inner surface of the DT ice layer.\n3. **Penalty**: If they coalesce inside the fuel, they heat the fuel too early, raising the adiabat and making the fuel incompressible.\n\n### Final Answer\n**Shock Coalescence** is the merging of multiple shocks into one. For an efficient implosion, this must occur at the **inner edge of the fuel layer**. If it occurs too early, it 'pre-heats' the fuel, significantly reducing the final density the fuel can achieve at stagnation."}]} +{"conversations": [{"from": "human", "value": "What is a 'Tent' in a NIF target, and why is it a major design concern?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Support Structure**: The 'tent' is a thin plastic film (~10-100 nm) used to hold the capsule in the center of the hohlraum.\n2. **Defect**: Where the tent touches the capsule, it creates a small mass perturbation.\n3. **Instability**: This perturbation is amplified by RTI, often injecting a 'streak' of mix into the hotspot.\n\n### Final Answer\nThe **Tent** is the thin membrane that supports the capsule. It is a major concern because it acts as a **localized hydrodynamic defect**. The perturbations seeded at the contact point between the tent and the capsule can grow into massive mix-jets that disrupt the hotspot's thermal balance."}]} +{"conversations": [{"from": "human", "value": "Define 'Areal Density' ($\\\\\rho R$) and explain why it is the primary metric for Alpha-particle confinement."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Particle Range**: Alpha particles (3.5 MeV) have a specific 'stopping distance' in DT plasma.\n2. **Metric**: This distance is measured in mass per unit area ($g/cm^2$).\n3. **Ignition Requirement**: To capture the Alpha energy, the fuel's $\\\\\rho R$ must be $> 0.3 g/cm^2$.\n\n### Final Answer\n**Areal Density ($\\\\\rho R$)** measures the total mass per unit area along a radius. It is the critical metric for **Alpha-particle confinement**; if $\\\\\rho R$ is too low, Alphas escape the hotspot without depositing their energy, and the plasma will fail to ignite."}]} +{"conversations": [{"from": "human", "value": "How does 'Surface Roughness' on the outer ablator surface differ from 'Internal Defects' in terms of RT seeding?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Outer Surface**: Seeds RT instability during the acceleration phase (at the ablation front).\n2. **Internal Defects (Voids/Inclusions)**: Can seed instabilities that grow throughout the entire implosion and may lead to earlier shell breakup.\n3. **Sensitivity**: HEDP experiments are extremely sensitive to sub-micron defects, requiring 'super-polishing' of the capsule surfaces.\n\n### Final Answer\n**Outer Surface Roughness** primarily seeds instabilities at the ablation front during early-time acceleration, whereas **Internal Defects** (like voids in the diamond lattice) can cause non-uniform shock propagation that disrupts the shell's integrity from the inside out."}]} +{"conversations": [{"from": "human", "value": "Why is 'Convergence' in a capsule often limited to a factor of ~30-40?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Symmetry Amplification**: Any 1% error in the drive symmetry is amplified by the convergence ratio $CR$.\n2. **Instability Limit**: High $CR$ implosions are highly unstable; small perturbations grow into 'fingers' that pierce the hotspot before maximum compression is reached.\n3. **Physics Limit**: At very high $CR$, the hotspot surface area becomes so small that thermal conduction and radiation losses dominate over compressional heating.\n\n### Final Answer\n**Convergence** is limited by **symmetry and stability**. As a capsule shrinks, any slight non-uniformity in the laser drive is magnified. Beyond a $CR$ of ~35, the implosion typically becomes too distorted to form a coherent hotspot, causing the fusion reaction to quench."}]} +{"conversations": [{"from": "human", "value": "What is the 'Self-Emission' of an ICF hotspot, and what does its shape tell us about the implosion?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **X-ray Emission**: At 4-5 keV, the hotspot emits intense X-rays via Bremsstrahlung.\n2. **Diagnostics**: These are captured by X-ray cameras (e.g., GXD).\n3. **Analysis**: A 'prolate' (sausage) or 'oblate' (pancake) shape indicates a P2 asymmetry in the drive pulse.\n\n### Final Answer\n**Self-Emission** is the X-ray light produced by the hot DT core. By imaging this emission, physicists can determine the **final shape of the hotspot**. Distortions in this shape are 'smoking guns' for asymmetries in the laser drive or hohlraum physics."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Double Shell' capsule design and its theoretical advantage over single-shell cryogenic targets."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Structure**: An outer shell that is ablated, which then crashes into an inner high-Z shell (like Gold or Tungsten) containing the fuel.\n2. **Advantage**: It relies on 'volume ignition' rather than a 'hotspot.' It can theoretically ignite at lower implosion velocities and is less sensitive to LPI.\n3. **Disadvantage**: Extremely difficult to manufacture and very sensitive to the 'collision' physics between the shells.\n\n### Final Answer\nThe **Double Shell** design uses an outer shell to impact an inner shell, compressing the fuel via a massive shock. Its main advantage is that it can reach fusion conditions at **lower implosion velocities**, potentially bypassing some of the LPI and symmetry issues that plague standard single-shell designs."}]} +{"conversations": [{"from": "human", "value": "What is 'Adiabat Shaping' and how does it utilize a decaying shock?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: You want the outer shell to be hot (stable) but the inner fuel to be cold (compressible).\n2. **Method**: A very strong picket creates a shock that 'decays' as it moves inward.\n3. **Result**: The outer ablator is placed on a high adiabat (stable), while the inner fuel stays on a low adiabat (compressible).\n\n### Final Answer\n**Adiabat Shaping** uses a decaying shock wave to create a **spatial gradient in the fuel entropy**. This allows the outer surface to be highly stable against Rayleigh-Taylor instability while keeping the inner fuel cold enough to achieve the extreme densities required for ignition."}]} +{"conversations": [{"from": "human", "value": "Why is 'Glass' (SiO2) sometimes used in the 'fill tube' instead of metal?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Transparency**: Allows for VISAR and other optical checks during target alignment.\n2. **Atomic Number**: SiO2 has a lower Z than metal tubes, reducing the radiative cooling if the tube material mixes into the hotspot.\n3. **Strength**: Glass tubes can be manufactured to be extremely thin (~5 microns) while still holding the pressure of the cryogenic DT gas.\n\n### Final Answer\n**Glass fill tubes** are used because they are **optically transparent and low-Z**. This reduces the amount of 'mix' radiation if the tube material enters the hotspot, and allows researchers to use laser-based diagnostics to check the capsule's alignment inside the hohlraum."}]} +{"conversations": [{"from": "human", "value": "Define 'Hotspot Pressure' and state the typical value achieved at the National Ignition Facility during an ignition shot."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The stagnated pressure of the central DT gas at peak compression.\n2. **Scale**: This pressure must exceed the pressures found at the center of the Sun.\n3. **Value**: NIF ignition shots typically achieve pressures between 300 and 600 Gigabars (Gbar).\n\n### Final Answer\n**Hotspot Pressure** is the pressure at the center of the compressed capsule. At the NIF, successful ignition shots reach pressures of **300 to 600 Gigabars**, which is several times higher than the pressure at the core of the Sun."}]} +{"conversations": [{"from": "human", "value": "Explain the role of 'Neutron Yield' as a diagnostic for capsule performance."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Direct Product**: Neutrons are the primary product of $D+T \\\\\to He + n$.\n2. **Total Energy**: Each neutron represents 17.6 MeV of total fusion energy. \n3. **Metric**: The 'Yield' ($Y_n$) is the total count of neutrons, which tells us the total fusion energy produced.\n\n### Final Answer\n**Neutron Yield** is the most direct measure of an ICF capsule's performance. By counting the total number of 14.1 MeV neutrons produced, physicists can calculate the **total fusion energy output** and determine how close the experiment came to the ignition threshold."}]} +{"conversations": [{"from": "human", "value": "What is 'Internal Reflection' in a hohlraum and how does it complicate the drive symmetry?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Wall Interactions**: Laser light hits the gold wall, but not all is absorbed.\n2. **Glancing Blows**: Some light reflects and hits other parts of the hohlraum or the capsule directly.\n3. **Symmetry**: These 'stray' reflections create 'hot spots' on the capsule that were not intended by the beam pointing, ruining the spherical symmetry of the implosion.\n\n### Final Answer\n**Internal Reflection** occurs when laser light 'bounces' off the gold walls instead of being absorbed. These stray reflections create **uncontrolled heating** on the capsule surface, leading to 'shiva-like' asymmetries that can cause the implosion to fail by distorting the compression shape."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Ablation Front' and why it is the most unstable part of the capsule during the 'Run-in' phase."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The interface where solid ablator material is turning into a high-pressure plasma.\n2. **Density Gradient**: You have high-pressure, low-density plasma pushing against lower-pressure, high-density solid material.\n3. **RT Conditions**: This is the classic setup for Rayleigh-Taylor instability; a light fluid pushing a heavy fluid under high acceleration.\n\n### Final Answer\nThe **Ablation Front** is the interface where laser/X-ray energy is converted into mechanical pressure. It is the most unstable region because it is subject to **Rayleigh-Taylor instability** throughout the entire 'run-in' (acceleration) phase, where perturbations grow exponentially as the plasma pushes the shell inward."}]} +{"conversations": [{"from": "human", "value": "What is 'Fuel Stratification' in a cryogenic capsule?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Cryogenic Loading**: DT is loaded as a gas and then frozen.\n2. **Separation**: Deuterium and Tritium have slightly different freezing points and densities.\n3. **Problem**: If the ice layer is not uniform in its D:T ratio, the fusion burn will be less efficient and the shock timing will vary across the capsule.\n\n### Final Answer\n**Fuel Stratification** is the unintended separation of Deuterium and Tritium within the frozen ice layer. Maintaining a **homogeneous 50/50 mix** is vital for maximizing the fusion cross-section and ensuring that the shocks propagate symmetrically through the fuel."}]} +{"conversations": [{"from": "human", "value": "Define the 'Laser Entrance Hole' (LEH) and explain the trade-off involved in choosing its diameter."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Function**: The LEH is the opening through which laser beams enter the hohlraum.\n2. **Large LEH**: Easier for beams to clear without hitting the edges (clipping), but allows more X-rays to escape (loss of drive efficiency).\n3. **Small LEH**: Better radiation containment but leads to 'LEH closing' where plasma blow-off from the edges blocks the lasers later in the pulse.\n\n### Final Answer\nThe **LEH diameter** is a balance between **laser clearance and radiation loss**. A larger LEH prevents the incoming lasers from being refracted or blocked by plasma blow-off, while a smaller LEH maximizes the hohlraum's energy efficiency by minimizing the 'hole loss' of the X-ray drive."}]} +{"conversations": [{"from": "human", "value": "What is 'Wall Blow-off' and how does it affect the symmetry of the X-ray drive over time?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Mechanism**: As lasers heat the hohlraum wall, the gold turns into a plasma and expands inward at supersonic speeds.\n2. **Symmetry Shift**: As the wall moves, the location where the lasers hit the wall (the X-ray source) shifts. \n3. **Result**: An initially symmetric drive can become 'pole-heavy' or 'equator-heavy' as the geometry of the emission spots changes relative to the capsule.\n\n### Final Answer\n**Wall Blow-off** is the inward expansion of the hohlraum's gold plasma. It causes **time-dependent asymmetry** because the physical locations of the X-ray emission spots migrate throughout the laser pulse, requiring dynamic 'tuning' of the laser beams to keep the compression spherical."}]} +{"conversations": [{"from": "human", "value": "Explain the function of a 'Rugby-shaped' hohlraum compared to a standard cylinder."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Cylindrical Limits**: Standard cylinders have large corners that are hard to illuminate uniformly.\n2. **Rugby Geometry**: A prolate spheroid (rugby ball) shape removes the corners and brings the walls closer to the capsule at the waist.\n3. **Advantages**: Improved coupling efficiency and better control over the P2 (pole-to-equator) symmetry without relying as heavily on Cross-Beam Energy Transfer (CBET).\n\n### Final Answer\nA **Rugby-shaped hohlraum** offers **higher energy coupling** than a cylinder. By curving the walls, the hohlraum volume is reduced and the X-ray source spots are positioned more favorably for symmetry, allowing for a more efficient drive with less laser energy."}]} +{"conversations": [{"from": "human", "value": "What are 'Glint' and 'Stray Light' in hohlraum experiments, and how do they impact diagnostics?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Glint**: Unabsorbed laser light that reflects off the hohlraum interior and exits through the LEH or hits a diagnostic.\n2. **Impact**: It can blind X-ray cameras or create 'ghost images' on spectrometers.\n3. **Mitigation**: Using 'Glint Shields' or specifically timed 'gates' on detectors to ignore the laser-on period.\n\n### Final Answer\n**Glint** is reflected laser light that interferes with measurements. It can **saturate sensitive detectors** and introduce noise into X-ray diagnostics, making it difficult to isolate the thermal emission of the capsule from the high-intensity background of the drive lasers."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Frustum' hohlraum and its role in Polar Direct Drive (PDD) research."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Geometry**: A frustum is a truncated cone.\n2. **Application**: Used in PDD to help redirect or 'shape' the drive in facilities where the laser beam ports are not optimized for direct drive (like NIF).\n3. **Function**: It acts as a hybrid between direct and indirect drive, using the cone walls to reflect or re-emit energy onto the capsule poles.\n\n### Final Answer\nA **Frustum** hohlraum is a truncated conical design used to **improve polar symmetry**. It is often used in experiments that attempt to use indirect-drive facilities for direct-drive physics, helping to compensate for a lack of beams at the poles of the target."}]} +{"conversations": [{"from": "human", "value": "How does 'Hohlraum Liner' material (e.g., a thin layer of CH or Teflon) prevent Gold-DT mix?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Risk**: Gold plasma from the hohlraum wall can stream toward the center and mix with the capsule.\n2. **The Liner**: A low-Z coating on the inner wall of the gold hohlraum.\n3. **Physics**: The low-Z liner expands faster than the gold, creating a 'buffer' or 'tamp' that holds the high-Z gold atoms back during the implosion.\n\n### Final Answer\n**Hohlraum Liners** are low-Z coatings that **tamp the gold wall expansion**. By creating a fast-expanding, low-density plasma buffer, they prevent high-Z gold atoms from reaching the capsule and poisoning the fusion hotspot with radiative cooling."}]} +{"conversations": [{"from": "human", "value": "What is 'X-ray Burnthrough' in hohlraum wall design?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The process where the X-ray heat wave (Marshak wave) completely penetrates the thickness of the hohlraum wall.\n2. **Result**: If the wall is too thin, energy leaks out of the back of the hohlraum, causing a drop in drive pressure.\n3. **Design**: Walls must be thick enough (~10-30 microns of Au) to ensure the Marshak wave never reaches the outer surface during the pulse.\n\n### Final Answer\n**X-ray Burnthrough** occurs when the radiation heat wave reaches the outer edge of the hohlraum wall. To maintain **radiation containment**, the walls must be engineered with sufficient thickness to ensure that the interior 'oven' remains sealed throughout the duration of the laser drive."}]} +{"conversations": [{"from": "human", "value": "Explain the role of the 'Inner Beam Cone' vs. the 'Outer Beam Cone' in hohlraum illumination."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Outer Beams**: Hit the wall near the LEH (the 'shoulders'). They primarily control the drive at the poles of the capsule.\n2. **Inner Beams**: Travel deep into the hohlraum to hit the 'waist.' They control the drive at the equator.\n3. **Symmetry Control**: By adjusting the power ratio between these two cones (the 'cone ratio'), designers can switch the implosion from 'pancake' to 'sausage' shapes.\n\n### Final Answer\nThe **Inner and Outer Beam Cones** are used to **balance equatorial vs. polar drive**. Adjusting the relative intensity of these beams is the primary method for ensuring a spherical implosion, as they illuminate different zones of the hohlraum wall relative to the capsule's surface."}]} +{"conversations": [{"from": "human", "value": "What is the 'View Factor' and how does it affect the capsule's 'perceived' symmetry inside a hohlraum?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: A geometric factor representing the fraction of the radiation emitted by the wall that is intercepted by the capsule.\n2. **Complexity**: The capsule doesn't see a uniform wall; it sees 'hot spots' where the lasers hit and 'cold spots' (the LEH and un-illuminated wall).\n3. **Integration**: The capsule integrates these sources; the further the wall is from the capsule, the smoother the drive appears (but the less energy is coupled).\n\n### Final Answer\nThe **View Factor** describes the geometric coupling between the hohlraum wall and the capsule. It is the reason why **hohlraum size** matters; a larger hohlraum provides a 'smoother' view of the X-ray source spots (better symmetry) but at the cost of lower overall drive pressure (lower efficiency)."}]} +{"conversations": [{"from": "human", "value": "Explain the 'Picket-Trough' temperature ratio in a hohlraum drive and its effect on the first shock."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Picket**: The initial high-power laser spike creates the first shock ($P_1$).\n2. **Trough**: A lower-power period prevents the first shock from becoming too strong too fast.\n3. **Adiabat**: The ratio of the picket temperature to the trough temperature determines the entropy (adiabat) of the fuel. A higher ratio generally stabilizes the implosion but limits compression.\n\n### Final Answer\nThe **Picket-Trough ratio** sets the **initial fuel adiabat**. It determines the strength of the first shock relative to the subsequent drive; a carefully tuned ratio ensures the fuel remains compressible while providing enough early-time pressure to suppress the growth of surface instabilities."}]} +{"conversations": [{"from": "human", "value": "How does 'Cross-Beam Energy Transfer' (CBET) depend on the plasma ion-acoustic wave speed?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Mechanism**: CBET is a Stimulated Brillouin Scattering (SBS) process where two laser beams 'exchange' energy by scattering off a common ion-acoustic wave.\n2. **Resonance**: The transfer is most efficient when the frequency difference between the beams matches the local ion-acoustic frequency ($\\\\omega_s = k \\\\cdot c_s$).\n3. **Tuning**: By changing the laser wavelength ($\\\\Delta \\\\lambda$), physicists can move in and out of resonance with the plasma's sound speed to control energy flow.\n\n### Final Answer\n**CBET efficiency** is tied to the **ion-acoustic resonance**. Because the transfer of energy depends on the beams 'coupling' via a plasma wave, the local temperature and flow velocity of the hohlraum gas determine which beams will gain or lose power, allowing for dynamic symmetry tuning."}]} +{"conversations": [{"from": "human", "value": "What is 'Drive Sag' and why does it occur at the end of long laser pulses?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: A drop in the X-ray drive pressure near the end of the laser pulse, even if laser power remains constant.\n2. **Causes**: (a) Wall expansion moves the emission spots into a less favorable geometry. (b) Plasma filling the hohlraum begins to refract or absorb laser light before it can reach the wall.\n3. **Result**: The capsule doesn't get the final 'push' needed for maximum stagnation pressure.\n\n### Final Answer\n**Drive Sag** is the late-time loss of X-ray drive efficiency. It is caused by **plasma filling and spot motion**; as the hohlraum chokes with plasma, the lasers can no longer effectively heat the walls, causing the 'oven' temperature to drop just as the capsule is reaching peak compression."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Spherical Hohlraum' (e.g., the 6-LEH design) and its theoretical symmetry advantages."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Cylindrical Symmetry**: Limited by the 2-LEH geometry (P2/P4 modes are hard to null).\n2. **6-LEH Design**: Places 6 laser entrance holes in a cubic arrangement around a spherical hohlraum.\n3. **Symmetry**: Theoretically provides much higher-order symmetry (nulling all modes below $\\\\ell=4$), making it nearly immune to the low-mode distortions that plague NIF-style cylinders.\n\n### Final Answer\nA **6-LEH Spherical Hohlraum** provides **inherent 3D symmetry**. By distributing the laser entry points across all axes, it eliminates the 'pole-vs-equator' conflict of cylindrical designs, potentially allowing for much higher convergence ratios without the need for complex wavelength tuning."}]} +{"conversations": [{"from": "human", "value": "What is 'M-band Preheat' and why is the choice of hohlraum gas (He vs. $C_5H_{12}$) relevant?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Preheat**: High-energy X-rays (2-4 keV) from the gold wall heat the fuel prematurely.\n2. **Gas Role**: Different gases have different LPI signatures. He is 'cleaner' but less effective at tamping the wall. Pentane ($C_5H_{12}$) tamps the wall better but can trigger more SRS (Stimulated Raman Scattering).\n3. **Link**: SRS generates 'hot' electrons which, like M-band X-rays, contribute to fuel preheat.\n\n### Final Answer\n**M-band Preheat** is the unwanted heating of the fuel by hard X-rays. The **Hohlraum Gas** choice is a trade-off: higher-Z gases tamp the wall better (reducing M-band emission from wall motion) but can increase **Laser-Plasma Instabilities (LPI)**, which creates hot electrons that cause their own form of preheat."}]} +{"conversations": [{"from": "human", "value": "Explain 'Albedo' in the context of hohlraum walls and why it is always $< 1$."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The ratio of reflected (re-emitted) radiation to incident radiation on the hohlraum wall.\n2. **Energy Loss**: The wall is not a perfect mirror; it heats up and a Marshak wave carries energy into the material.\n3. **Value**: Typical hohlraum albedos are ~0.7-0.85.\n\n### Final Answer\n**Wall Albedo** measures the efficiency of radiation containment. It is always less than unity because a portion of the X-ray energy is always **lost to the wall** via thermal conduction and the propagation of a radiative heat wave into the solid gold material."}]} +{"conversations": [{"from": "human", "value": "What is the 'Spot Motion' effect and how does it relate to 'P2' asymmetry?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Motion**: As the laser-heated wall expands, the spot where the laser hits moves toward the center (radially) and toward the LEH (axially).\n2. **Asymmetry**: This motion changes the angle at which X-rays hit the capsule.\n3. **Result**: A drive that starts 'round' might become 'oblate' (pancake) as the spots move toward the poles (P2 mode).\n\n### Final Answer\n**Spot Motion** is the physical migration of the X-ray source points as the hohlraum walls expand. This motion directly causes **time-varying P2 asymmetry**, forcing physicists to compensate by changing the laser beam power throughout the pulse to maintain a spherical implosion."}]} +{"conversations": [{"from": "human", "value": "How do 'Inner Beam Glint' shields work in high-performance hohlraums?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Problem**: Inner beams must travel the longest distance and are most prone to reflecting off the plasma.\n2. **Shields**: Specifically placed features or dopants in the hohlraum gas or wall.\n3. **Function**: They absorb or scatter reflected laser light before it can reach the capsule or exit the LEH to hit diagnostics.\n\n### Final Answer\n**Glint Shields** are used to **suppress stray laser reflections**. By strategically placing absorbing material, designers ensure that reflected inner-beam light doesn't create localized 'hot spots' on the capsule or interfere with sensitive X-ray imaging diagnostics."}]} +{"conversations": [{"from": "human", "value": "Define 'Radiation Conversion Efficiency' (CE) in a hohlraum. What is the typical percentage for a gold wall?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The fraction of incident laser energy that is converted into thermal X-rays.\n2. **Physics**: Depends on the laser intensity and the $Z$ of the wall.\n3. **Value**: For standard NIF hohlraums, CE is typically between 70% and 85%.\n\n### Final Answer\n**Radiation Conversion Efficiency (CE)** is the percentage of laser light turned into X-rays. For gold hohlraums, CE is roughly **75-80%**; the remaining 20-25% of the energy is lost to plasma kinetic energy, laser reflection, and non-thermal particle acceleration."}]} +{"conversations": [{"from": "human", "value": "Why is the hohlraum 'Fill Gas' usually kept at a very low density (e.g., 0.6 - 1.5 mg/cc)?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **High Density**: Better at tamping the wall but causes massive LPI (SRS/SBS) and beam refraction.\n2. **Low Density**: Minimizes LPI but allows the wall to expand too quickly (choking the hohlraum).\n3. **Optimum**: 0.6-1.5 mg/cc is the 'sweet spot' where wall motion is managed without the laser being completely scattered by the gas plasma.\n\n### Final Answer\n**Hohlraum Gas Density** is kept low to **minimize Laser-Plasma Instabilities (LPI)**. If the gas were denser, it would reflect or refract the laser beams before they could reach the hohlraum walls, effectively 'blinding' the hohlraum and destroying the drive symmetry."}]} +{"conversations": [{"from": "human", "value": "What is 'Window Blow-off' and how does it affect early-time shock timing?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Window**: A thin polyimide film used to hold the gas inside the hohlraum LEH.\n2. **Blow-off**: The very first part of the laser pulse vaporizes this window.\n3. **Timing**: The time it takes for the laser to 'burn through' this window adds a delay to when the hohlraum starts heating, which must be accounted for in shock-timing models.\n\n### Final Answer\n**Window Blow-off** is the vaporization of the LEH seal by the initial laser pulse. It creates a **sub-nanosecond delay** in the radiation drive, which is a critical factor in 'Shock Timing'; if not correctly modeled, the first shock will arrive at the fuel too late, ruining the compression adiabat."}]} +{"conversations": [{"from": "human", "value": "Describe a 'Vacuum Hohlraum' experiment and why it is used for fundamental LPI studies."}, {"from": "gpt", "value": "### Reasoning Process\n1. **No Gas**: Unlike ignition targets, these have no gas fill.\n2. **Simplicity**: Without gas, there is no CBET or gas-driven SRS. The only plasma comes from the gold wall.\n3. **Utility**: It allows physicists to isolate the 'Wall-LPI' from the 'Gas-LPI,' providing a clean baseline for code validation.\n\n### Final Answer\nA **Vacuum Hohlraum** has no internal gas fill. It is used to **isolate wall-plasma physics**, allowing researchers to study laser-gold interactions without the complicating effects of gas-driven instabilities like Cross-Beam Energy Transfer."}]} +{"conversations": [{"from": "human", "value": "How does 'Hohlraum Tilt' or misalignment affect the implosion?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Alignment**: The hohlraum must be perfectly centered on the laser axis.\n2. **Tilt**: A tilt causes one side of the capsule to see more 'hot spot' area than the other.\n3. **Result**: Induces a 'P1' (dipole) asymmetry, where the capsule is 'pushed' to one side, leading to a massive loss in stagnation pressure.\n\n### Final Answer\n**Hohlraum Tilt** introduces a **P1 (dipole) asymmetry**. This causes the capsule to implode off-center, leading to 'shell-jetting' where the fuel is pushed toward one side, preventing the formation of a stable central hotspot and significantly reducing fusion yield."}]} +{"conversations": [{"from": "human", "value": "What is the 'Drive Temperature' ($T_r$) and how does it relate to the laser power $P_L$?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Stefan-Boltzmann link**: The X-ray energy density scales as $T_r^4$.\n2. **Power Balance**: In a steady state, laser power equals radiation loss through the LEH + loss into the walls + drive on the capsule.\n3. **Scaling**: Roughly, $T_r \\\\propto P_L^{1/4}$.\n\n### Final Answer\n**Drive Temperature ($T_r$)** is the equivalent blackbody temperature of the hohlraum radiation field. It scales with the **fourth root of the laser power**; doubling the drive temperature would require a 16-fold increase in laser power, which is why ICF facilities are pushed to their extreme energy limits."}]} +{"conversations": [{"from": "human", "value": "Explain 'Hohlraum Shadowing' by the capsule and its effect on 'Equator' drive."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Obstruction**: The capsule sits in the middle of the hohlraum.\n2. **Shadow**: The capsule can physically block the 'view' of certain hot spots on the far wall from reaching other parts of the capsule.\n3. **Result**: This creates a 'shadowed' region at the equator that receives less X-ray flux, often requiring higher power in the inner laser beams to compensate.\n\n### Final Answer\n**Hohlraum Shadowing** occurs when the capsule blocks its own view of the X-ray sources. This leads to an **intrinsic equatorial deficit** in radiation, which physicists must overcome by 'over-driving' the inner laser beams to ensure the capsule equator is compressed as strongly as its poles."}]} +{"conversations": [{"from": "human", "value": "What is 'Laser Beam Clipping' at the LEH and why is it a major power limit?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Narrow LEH**: To save energy, you want a small LEH.\n2. **Beam Profile**: Laser beams are not infinitely thin; they have a spatial profile.\n3. **Clipping**: If the beam hits the edge of the LEH, it creates a 'spark' of gold plasma that can block the rest of the beam or damage the hohlraum before the pulse is finished.\n\n### Final Answer\n**Beam Clipping** occurs when the laser strikes the edges of the LEH. This is a **fundamental power limit** because it triggers 'LEH closing' prematurely, where the resulting plasma prevents the remaining laser energy from entering the hohlraum, effectively 'turning off' the drive."}]} +{"conversations": [{"from": "human", "value": "Describe a 'Dual-Ablator' hohlraum experiment and its purpose."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: Using two different capsule materials (e.g., HDC and Be) in the same hohlraum environment (often by putting two capsules in one long hohlraum).\n2. **Purpose**: To compare their sensitivity to the *exact same* radiation drive, removing 'shot-to-shot' variation from the data.\n\n### Final Answer\n**Dual-Ablator** experiments are used to **directly compare material performance**. By placing two different capsules in the same hohlraum, researchers can determine which material is more stable or efficient under identical radiation conditions, providing a high-precision 'A-B test' for fusion designs."}]} +{"conversations": [{"from": "human", "value": "What is 'Wall Motion' vs. 'Gas Motion' in a hohlraum, and which one is faster?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Wall Motion**: Gold plasma expanding at $c_s$ (sound speed of gold).\n2. **Gas Motion**: He/Pentane plasma expanding at its own $c_s$.\n3. **Comparison**: Because sound speed $c_s \\\\propto \\\\sqrt{T/M}$, the low-mass gas plasma (He) moves much faster than the high-mass gold plasma at the same temperature.\n\n### Final Answer\n**Gas Motion is faster than Wall Motion**. Because helium or hydrogen ions are much lighter than gold atoms, the hohlraum's gas fill plasma expands rapidly to fill the volume, while the heavy gold wall plasma moves more slowly, following behind like a 'pusher' that chokes the hohlraum late in time."}]} +{"conversations": [{"from": "human", "value": "How does 'Laser Smoothing' (like SSD) affect the Hohlraum's X-ray conversion efficiency?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Smoothing**: SSD reduces the local 'hot spots' (speckles) in the laser beam.\n2. **Effect**: Lower speckle intensity means less LPI (SRS/SBS). \n3. **CE Link**: While smoothing doesn't change the *intrinsic* gold conversion efficiency much, it ensures more laser energy reaches the wall instead of being reflected away, thus increasing the 'effective' CE of the system.\n\n### Final Answer\n**Laser Smoothing** improves hohlraum performance by **suppressing energy-robbing LPI**. By removing high-intensity speckles, it prevents the laser from being reflected back out of the LEH, ensuring that the maximum amount of energy is converted into X-rays at the gold wall."}]} +{"conversations": [{"from": "human", "value": "Define 'Hohlraum Cooling' after the laser pulse and its impact on 'Rebound' diagnostics."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Cooling**: Once the lasers turn off, the hohlraum temperature drops rapidly via radiation through the LEH.\n2. **Rebound**: The capsule stagnates and then expands (rebounds).\n3. **Impact**: The decreasing hohlraum pressure means there is no 'tamp' to hold the capsule together late in time, allowing the rebound to be captured clearly by self-emission diagnostics.\n\n### Final Answer\n**Hohlraum Cooling** occurs immediately after the 'laser-off' time. This rapid drop in pressure allows the capsule to **expand (rebound) freely** after stagnation, providing a 'clean' window for diagnostics to measure the final yield and core temperature without interference from the drive pressure."}]} +{"conversations": [{"from": "human", "value": "Explain the concept of 'Adiabat Control' and why a higher adiabat is sometimes used despite it making the fuel harder to compress."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The adiabat $\\\\alpha$ is the ratio of the fuel pressure to the Fermi degenerate pressure. A 'low adiabat' means the fuel is cold and highly compressible.\n2. **The Conflict**: While low-adiabat implosions reach higher densities, they are much more sensitive to Rayleigh-Taylor instabilities.\n3. **Stability Trade-off**: Increasing the adiabat (usually via a stronger initial 'picket' pulse) increases the ablation velocity $v_a$, which stabilizes the ablation front.\n\n### Final Answer\n**Adiabat Control** is the tuning of the fuel's internal energy. While a low adiabat is theoretically more efficient for compression, physicists often use a **'high-foot' pulse** (higher adiabat) to increase hydrodynamic stability. This makes the implosion more robust against shell breakup at the cost of requiring more laser energy to reach the same final density."}]} +{"conversations": [{"from": "human", "value": "How does the 'Convergence Ratio' ($CR$) relate to the required pressure for ignition?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: $CR = R_{initial} / R_{stagnation}$.\n2. **Pressure Scaling**: The final pressure $P_{hotspot}$ scales roughly as $P_{ablated} \times (CR)^4$ in an ideal spherical implosion.\n3. **Ignition Requirement**: To reach the Gbar (Gigabar) pressures needed for ignition, $CR$ typically needs to be between 25 and 35.\n\n### Final Answer\nThe **Convergence Ratio** determines the amplification of the ablation pressure. Because the required ignition pressure is extreme (~300-400 Gbar), a high $CR$ is necessary. However, as $CR$ increases, the symmetry requirements become exponentially tighter, as small initial asymmetries are magnified by the ratio of the radius change."}]} +{"conversations": [{"from": "human", "value": "What is the role of the 'DT Ice Layer' in a cryogenic ICF target, and why is its surface roughness critical?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Target Structure**: A central DT gas region surrounded by a thin layer of solid DT ice, inside a plastic/HDC shell.\n2. **Function**: The ice layer provides the bulk of the fuel mass. During implosion, it acts as the piston that compresses the central gas 'spark plug.'\n3. **Instability Seeding**: Any roughness on the inner surface of the ice layer serves as an initial perturbation for RTI during the deceleration phase.\n\n### Final Answer\nThe **DT Ice Layer** serves as the main fuel reservoir. Its **surface roughness** must be less than 1 micron (RMS) because any bumps or pits act as seeds for Rayleigh-Taylor instability. During stagnation, these imperfections grow into 'jets' of cold fuel that can pierce the hotspot and quench the fusion burn."}]} +{"conversations": [{"from": "human", "value": "Define 'Implosion Velocity' ($v_{imp}$) and state the typical range required for DT ignition."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Energy Conversion**: The laser energy is converted to kinetic energy of the shell. At stagnation, this kinetic energy is converted into internal energy (heat) of the hotspot.\n2. **Scaling**: The hotspot temperature $T$ scales as $v_{imp}^2$.\n3. **Threshold**: For DT ignition, $v_{imp}$ typically needs to exceed 350-400 km/s.\n\n### Final Answer\n**Implosion Velocity** is the peak speed of the fuel shell as it moves toward the center. To achieve ignition, $v_{imp}$ must reach **350,000 to 400,000 meters per second**. If the velocity is too low, the stagnation temperature will fall below the 4-5 keV threshold where Alpha heating takes over."}]} +{"conversations": [{"from": "human", "value": "Explain 'Bang Time' in ICF and what it indicates if it occurs earlier than predicted by simulations."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: Bang Time is the moment of peak X-ray or neutron emission, indicating maximum compression.\n2. **Timing Analysis**: If Bang Time is early, it suggest the shell moved faster than expected or the shocks coalesced prematurely.\n3. **Physical Cause**: Often indicates 'pre-heating' of the fuel (reducing compressibility) or a higher-than-expected ablation pressure.\n\n### Final Answer\n**Bang Time** is the interval between the start of the laser pulse and the peak of the fusion reaction. An **early Bang Time** often indicates that the fuel was pre-heated (by X-rays or electrons), making it less compressible and causing the implosion to 'rebound' sooner than a perfectly cold, optimized implosion would."}]} +{"conversations": [{"from": "human", "value": "What are 'M-band' X-rays in a gold hohlraum, and how do they affect the capsule?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Origin**: Electronic transitions in the M-shell of gold atoms ($n=3 \to n=4,5$) in the hohlraum wall, typically in the 2-3.5 keV range.\n2. **Penetration**: Unlike the thermal 'drive' X-rays (~300 eV), M-band X-rays are hard enough to penetrate the ablator and reach the fuel.\n3. **Pre-heat**: This energy deposition heats the fuel before the shock arrives, raising the adiabat and making the capsule harder to compress.\n\n### Final Answer\n**M-band X-rays** are high-energy photons produced by the hohlraum's gold plasma. They are dangerous because they **pre-heat the DT fuel**, increasing its pressure prematurely and limiting the final compression ratio. This is usually mitigated by adding mid-Z 'dopants' like Germanium to the ablator to absorb these specific frequencies."}]} +{"conversations": [{"from": "human", "value": "Describe 'Stagnation' in the context of an ICF capsule."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The phase where the inward kinetic energy of the fuel is converted into thermal energy as the plasma comes to a halt at the center.\n2. **Pressure Equilibrium**: Occurs when the internal pressure of the hotspot equals the pressure of the surrounding inward-moving 'pusher' fuel.\n3. **Duration**: Typically lasts for ~100 picoseconds.\n\n### Final Answer\n**Stagnation** is the final stage of an implosion where the fuel reaches its maximum density and temperature. During this brief window, the kinetic energy of the shell is transformed into the internal pressure of the **hotspot**, reaching the conditions necessary for the fusion 'spark' to ignite the surrounding cold fuel."}]} +{"conversations": [{"from": "human", "value": "What is 'Laser Imprint' and how is it mitigated in Direct Drive ICF?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Problem**: Small non-uniformities in the laser beam intensity 'imprint' themselves as pressure variations on the target surface.\n2. **Consequence**: These variations act as initial seeds for the Rayleigh-Taylor instability.\n3. **Mitigation**: Techniques like 'Smoothing by Spectral Dispersion' (SSD) and 'Distributed Phase Plates' (DPP) are used to 'average out' the beam profile over time.\n\n### Final Answer\n**Laser Imprint** refers to the spatial non-uniformities in a laser beam that create small 'dents' in the capsule surface at the start of the pulse. In **Direct Drive**, this is mitigated using **SSD (Smoothing by Spectral Dispersion)** and **DPPs (Distributed Phase Plates)**, which rapidly shift the laser's speckle pattern to create a smoother, more uniform pressure drive."}]} +{"conversations": [{"from": "human", "value": "How does 'Skyline' or hohlraum geometry affect the P2 and P4 symmetry of a capsule implosion?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **P2 (Legendre Mode)**: Represents 'pole-to-equator' asymmetry (pancaking or sausaging).\n2. **P4 (Legendre Mode)**: Represents 'square-like' or 'diamond-like' distortions.\n3. **Hohlraum Role**: The length-to-width ratio of the hohlraum and the placement of the laser spots directly determine these modes.\n\n### Final Answer\nIn ICF, **P2 and P4 symmetry** describe the low-mode shapes of the compressed core. A hohlraum that is too long will cause a **'sausage' (prolate)** distortion, while one that is too short causes a **'pancake' (oblate)** shape. Precise control of the laser 'cone ratio' (the power balance between inner and outer beams) is used to null out these modes for a perfectly spherical core."}]} +{"conversations": [{"from": "human", "value": "Define 'Fusion Gain' ($Q$) and the 'Scientific Breakeven' threshold."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition of Q**: The ratio of fusion energy produced ($E_{out}$) to the laser energy delivered to the target ($E_{in}$).\n2. **Scientific Breakeven**: $Q=1$.\n3. **Target Gain**: For a practical power plant, $Q$ must be $> 100$ to account for laser efficiency and plant overhead.\n\n### Final Answer\n**Fusion Gain ($Q$)** is the ratio of output fusion energy to input laser energy. **Scientific Breakeven** is achieved at **$Q=1$**. NIF exceeded this threshold in December 2022, marking the first time in history that a controlled fusion reaction produced more energy than was used to drive it."}]} +{"conversations": [{"from": "human", "value": "What is 'Electron Pre-heat' and why is it problematic for ICF target physics?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Source**: Laser-plasma instabilities (like Two-Plasmon Decay) generate high-energy 'hot' electrons.\n2. **Mechanism**: These electrons have a long mean-free path and can fly through the ablator into the fuel before the shock arrives.\n3. **Effect**: They heat the fuel, increasing its internal pressure and reducing the final compression achievable.\n\n### Final Answer\n**Electron Pre-heat** occurs when non-linear laser effects create a population of high-energy electrons that 'outrun' the hydrodynamic shock. This causes the **fuel to expand prematurely**, significantly increasing the amount of work the laser must do to compress the fuel and preventing the high densities needed for ignition."}]} +{"conversations": [{"from": "human", "value": "Explain 'Fast Ignition' as an alternative to the standard 'Hot Spot' ignition model."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Standard Model**: Uses a single pulse to both compress and heat the fuel (requires extreme symmetry).\n2. **Fast Ignition**: Separates the tasks. One set of lasers compresses the fuel to high density, and a second ultra-fast, high-intensity laser (or ion beam) 'sparks' the edge of the fuel.\n3. **Advantage**: Lower symmetry requirements and potentially higher gain.\n\n### Final Answer\n**Fast Ignition** is a 'two-step' fusion concept that decouples fuel compression from heating. By using an ultra-short, petawatt-class laser to ignite the fuel after it has been compressed by a separate driver, it theoretically allows for **much higher fusion gains** with less demanding symmetry requirements than the conventional central hot-spot approach."}]} +{"conversations": [{"from": "human", "value": "What is 'Shock Ignition' and how does it utilize the final laser power ramp?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: A variant of ICF where the fuel is compressed at a low velocity, then a final 'spike' in laser power sends a high-pressure shock to ignite the core.\n2. **Advantage**: Reduces the risk of RTI during the main implosion because the bulk velocity is lower.\n\n### Final Answer\n**Shock Ignition** uses a final, intense spike in laser power to launch a late-time shock wave that converges at the center just as the fuel reaches peak density. This effectively 'over-pressurizes' the core to reach ignition temperatures, allowing for a **more stable, lower-velocity implosion** during the main compression phase."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Lawson Criterion' specifically for Inertial Fusion (the $n \tau$ product)."}, {"from": "gpt", "value": "### Reasoning Process\n1. **General Lawson**: $nT\tau > \text{constant}$.\n2. **ICF Version**: Since $\tau$ is determined by the disassembly time ($R/c_s$), the criterion is often expressed in terms of the areal density $\rho R$.\n3. **Threshold**: For DT, $\rho R \\\\approx 0.3 \text{ g/cm}^2$ is required for the Alphas to stop and heat the plasma.\n\n### Final Answer\nIn ICF, the **Lawson Criterion** is typically expressed as the **areal density ($\rho R$)** of the fuel. To achieve ignition, the product of density and radius must exceed approximately **0.3 g/cm\u00b2**. This ensures that the fusion-produced alpha particles are stopped within the fuel, depositing their energy to sustain the burn."}]} +{"conversations": [{"from": "human", "value": "How does 'Fill Tube' geometry contribute to hotspot asymmetry in NIF targets?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Component**: A tiny glass tube (microns wide) used to inject DT fuel into the capsule.\n2. **Interaction**: As the ablation front passes the tube, it creates a shadow and a jet of material that flows into the capsule.\n3. **Result**: This jet seeds a large, localized instability that can inject carbon 'mix' directly into the hotspot.\n\n### Final Answer\nThe **Fill Tube** is a necessary engineering feature that acts as a major **hydrodynamic defect**. During implosion, it creates a 'shadow' in the laser/X-ray drive and seeds a jet of ablator material that can travel all the way to the center, disrupting the hotspot symmetry and cooling the plasma via high-Z mixing."}]} +{"conversations": [{"from": "human", "value": "What is 'Ablative Stabilization' and which instability does it primarily affect?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Instability**: Rayleigh-Taylor (RTI).\n2. **Mechanism**: In a classical fluid, RTI grows at all wavelengths. In an ablated plasma, material is constantly being removed from the surface.\n3. **Effect**: This 'mass flow' carries away the small-wavelength perturbations before they can grow, effectively 'polishing' the surface.\n\n### Final Answer\n**Ablative Stabilization** is a unique HEDP effect that reduces the growth rate of the **Rayleigh-Taylor Instability**. The constant 'boiling off' (ablation) of the shell surface acts like a fire polisher, smoothing out short-wavelength wrinkles and allowing ICF capsules to be compressed much more than a classical, non-ablating fluid ever could."}]} +{"conversations": [{"from": "human", "value": "Why is 'Deuterium-Tritium' (DT) used instead of pure Deuterium or Proton-Boron for current ICF research?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Cross-section**: DT has the highest fusion cross-section (probability of reaction) at the lowest temperatures (~10-20 keV).\n2. **Energy Yield**: It releases 17.6 MeV per reaction.\n3. **Feasibility**: Other reactions (like p-B11) require temperatures 10x higher, which current laser facilities cannot yet achieve in a compressed core.\n\n### Final Answer\n**DT fuel** is used because it has the **lowest ignition temperature** and the highest reaction probability of any fusion fuel. While other fuels like Proton-Boron are 'cleaner' (no neutrons), the physics requirements to ignite them are currently beyond the reach of modern HEDP facilities."}]} +{"conversations": [{"from": "human", "value": "What is the 'Self-Similarity' assumption in ICF implosion modeling?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: Assumes the spatial profiles of pressure, density, and velocity maintain the same functional form as the capsule shrinks, just scaled by the radius $R(t)$.\n2. **Utility**: Allows complex 3D hydrodynamics to be approximated by simpler 1D analytical models (like the Guderley blast wave or Sedov solutions).\n\n### Final Answer\n**Self-Similarity** is a simplifying assumption that the relative shape of the fuel's density and pressure profiles remains constant during the implosion. This allows researchers to use **analytical scaling laws** to predict how changing the laser energy will affect the final stagnation pressure without running a full 3D supercomputer simulation every time."}]} +{"conversations": [{"from": "human", "value": "Explain 'Radiative Loss' in the hotspot and the role of Bremsstrahlung radiation."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Bremsstrahlung**: 'Braking radiation' emitted when electrons are deflected by ions.\n2. **Scaling**: Power loss scales as $Z^2 n_e n_i \\\\sqrt{T}$.\n3. **Ignition Balance**: For ignition, Alpha heating (which scales as $n^2 \\\\langle \\\\sigma v \rangle$) must grow faster with temperature than Bremsstrahlung losses.\n\n### Final Answer\n**Bremsstrahlung radiation** is the primary cooling mechanism of the fusion hotspot. If the plasma is too dirty (high Z) or too cold, the energy lost through these X-rays will exceed the energy gained from fusion, causing the 'spark' to fizzle. Reaching the **'ideal ignition temperature'** is essentially the point where Alpha heating power finally overtakes Bremsstrahlung loss power."}]} +{"conversations": [{"from": "human", "value": "What is the 'Bell-Plesset' effect and how does it modify classical RTI in a converging ICF target?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Classical RTI**: Assumes a planar interface.\n2. **Convergent Geometry**: In ICF, the capsule is a sphere shrinking in radius $R(t)$.\n3. **Physical Mechanism**: As the shell converges, the surface area decreases. This geometric 'crowding' causes perturbations to grow even without acceleration.\n4. **Mathematical Result**: The Bell-Plesset effect adds a term to the growth rate that accounts for the changing radius and shell thickness: $\\\\dot{\\\\eta}/\\\\eta \\\\propto -2\\\\dot{R}/R$.\n\n### Final Answer\nThe **Bell-Plesset effect** is the geometric enhancement of instability growth due to **convergence**. In spherical ICF targets, it means that even if the interface were perfectly stable against RTI, the perturbations would still increase in amplitude simply because the surface they inhabit is shrinking. This makes convergence ratio ($CR$) a critical but dangerous parameter in fusion design."}]} +{"conversations": [{"from": "human", "value": "How does magnetic field $B$ suppress the Kelvin-Helmholtz Instability (KHI) in magnetized HEDP jets?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **KHI Source**: Driven by velocity shear $\\\\Delta v$ at an interface.\n2. **Magnetic Interaction**: If a magnetic field is aligned with the flow ($B \\\\parallel v$), the field lines must be bent to allow the instability to grow.\n3. **Magnetic Tension**: Bending field lines requires energy (magnetic tension force). \n4. **Stability Criterion**: The interface becomes stable if the Alfv\u00e9n speed $v_A$ is high enough relative to the shear: $(\\\\Delta v)^2 < 2(v_{A1}^2 + v_{A2}^2)$.\n\n### Final Answer\nMagnetic fields suppress **KHI** through **magnetic tension**. When the field lines are parallel to the flow shear, they act like 'elastic bands' that resist the curling motion of the instability. This is vital in laboratory astrophysics for explaining why certain supersonic plasma jets remain collimated over long distances instead of breaking up into turbulence."}]} +{"conversations": [{"from": "human", "value": "Explain the significance of the 'Atwood Number' ($A$) in the context of a NIF capsule's ablator-fuel interface."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: $A = (\rho_{heavy} - \rho_{light}) / (\rho_{heavy} + \rho_{light})$.\n2. **Role in RTI**: The growth rate $\\\\gamma$ is directly proportional to $\\\\sqrt{A}$. \n3. **Interface Dynamics**: At the interface between the HDC (diamond) ablator and the DT ice, a high Atwood number increases the risk of 'mix.'\n4. **Phase Reversal**: If $A$ is negative (light fluid pushing heavy), the interface is theoretically stable, but in ICF, the direction of acceleration changes, meaning $A$ effectively flips sign during the pulse.\n\n### Final Answer\nThe **Atwood Number** determines the efficiency of energy transfer into instability growth. In ICF, designers try to keep $A$ as low as possible at critical interfaces to minimize the 'mix' of ablator atoms (high-Z) into the DT fuel (low-Z), which would otherwise cause massive radiative cooling and prevent ignition."}]} +{"conversations": [{"from": "human", "value": "Define the 'Mix Width' in HEDP and how it is typically measured in a Z-pinch experiment."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The mix width is the spatial extent of the region where two previously distinct materials have interpenetrated due to instabilities.\n2. **Diagnostic Selection**: Z-pinch experiments often use X-ray self-emission or absorption spectroscopy.\n3. **Technique**: By 'doping' one material with a tracer (e.g., Chlorinated plastic), researchers can look for the specific spectral lines of the dopant appearing in the region where only the other material should be.\n4. **Data Interpretation**: The width of the emitting region of the dopant, captured via a gated X-ray slit camera, provides the mix width.\n\n### Final Answer\nThe **Mix Width** is the thickness of the turbulent zone between two fluids. In Z-pinches or laser experiments, it is measured using **X-ray spectroscopy or imaging of tracer dopants**. A larger mix width indicates higher instability growth, which degrades the final stagnation pressure and temperature."}]} +{"conversations": [{"from": "human", "value": "How does Benoit-Joseph Gr\u00e9a (CEA) utilize ML to improve the modeling of the Rayleigh-Taylor turbulent mixing zone?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Problem**: Turbulent mixing in HEDP is too small-scale to be fully resolved in 3D ICF codes.\n2. **Gr\u00e9a's Approach**: He focuses on high-Reynolds number turbulence and the spectral evolution of the mixing zone.\n3. **ML Integration**: Using Deep Neural Networks (DNNs) trained on Direct Numerical Simulation (DNS) data to create more accurate sub-grid scale (SGS) models that predict how RTI transitions from linear growth to a self-similar turbulent state.\n\n### Final Answer\n**Benoit-Joseph Gr\u00e9a** and researchers at **CEA** use ML to close the equations of **turbulent mixing**. By training models on high-resolution DNS data, they develop closures for the 'mix width' that better account for the spectral transfer of energy, allowing lower-resolution Rad-Hydro codes to accurately predict how much ablator material will contaminate the DT fuel."}]} +{"conversations": [{"from": "human", "value": "Explain the concept of 'Transfer Learning' in the context of NIF ignition experiments and the LLNL 'Lead-Shot' strategy."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Data Scarcity**: Real NIF shots are expensive and rare (only a few per year reach record yields).\n2. **The Strategy**: Train a large neural network on billions of 'synthetic' simulation shots (which are 'cheap' but slightly inaccurate).\n3. **The 'Transfer'**: Use the small amount of 'real' experimental data to fine-tune the final layers of the network.\n4. **Result**: A model that balances the broad physics of simulations with the ground-truth reality of the facility.\n\n### Final Answer\n**Transfer Learning** is used at LLNL to calibrate simulation-based models with **experimental data**. Because the 'real' physics at the NIF often differs from 1D/2D simulations, the model is first trained on massive synthetic datasets and then 're-weighted' using data from past experiments to predict the instability growth of future ignition-scale shots."}]} +{"conversations": [{"from": "human", "value": "What is a 'Physics-Informed Neural Network' (PINN) and how is it applied to the Euler equations in HEDP?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Standard NN**: A black box that maps input to output.\n2. **PINN**: The loss function includes the residual of the governing partial differential equations (PDEs), such as the Euler or Navier-Stokes equations.\n3. **HEDP Use**: Ensures the ML surrogate doesn't violate conservation of mass, momentum, or energy when predicting the breakup of an ICF shell.\n\n### Final Answer\nA **Physics-Informed Neural Network (PINN)** embeds the laws of physics directly into the ML training process. In HEDP, this ensures that surrogates predicting **hydrodynamic instabilities** strictly adhere to the **Euler equations**, preventing the model from suggesting 'optimal' designs that are physically impossible (e.g., violating mass conservation)."}]} +{"conversations": [{"from": "human", "value": "In the work of Belof et al., how is 'Bayesian Optimization' used to suppress shell-jetting?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Shell-Jetting**: A localized instability often caused by the capsule fill-tube or support tent.\n2. **Optimization**: Bayesian methods treat the design space as a probability distribution.\n3. **Suppression**: The algorithm iteratively suggests tweaks to the ablator dopant profile or fill-tube geometry to minimize the 'Mix Mass' in the hotspot while maximizing the 'Confidence Interval' of ignition.\n\n### Final Answer\n**Bayesian Optimization** is used to navigate the trade-offs between stability and yield. By quantifying the uncertainty of instability growth, it identifies designs that are **'statistically robust'**\u2014meaning they are less likely to fail if there are small manufacturing defects in the capsule or slight fluctuations in the laser drive."}]} +{"conversations": [{"from": "human", "value": "Define 'Autoencoders' and their use in 'Dimensionality Reduction' for 3D HEDP simulation data."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Data Volume**: A single 3D HYDRA simulation can produce terabytes of data.\n2. **Autoencoder**: A neural network that compresses data into a 'latent space' (encoder) and then reconstructs it (decoder).\n3. **Application**: Finding the 'latent features' of an instability (like the characteristic wavelength of a Rayleigh-Taylor bubble) without having to store or analyze every single mesh cell.\n\n### Final Answer\n**Autoencoders** are used for **feature extraction** in HEDP. They allow researchers to compress massive 3D simulation datasets into a compact set of 'shape parameters,' making it possible to compare the morphology of different instabilities across thousands of simulations to find common patterns of failure."}]} +{"conversations": [{"from": "human", "value": "How does 'Deep Reinforcement Learning' (DRL) assist in active pulse-shaping at the National Ignition Facility?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Agent**: An AI that 'plays' a game where the goal is maximum fusion yield.\n2. **The Action**: Modifying the power of the laser 'picket' or 'main drive' in real-time.\n3. **The Reward**: A simulation result with reduced RTI growth and higher stagnation pressure.\n\n### Final Answer\n**Deep Reinforcement Learning** is applied to **active pulse-shaping**. The DRL agent learns to adjust the laser power levels to dynamically 'counter-act' the growth of shocks and instabilities, effectively discovering complex, non-intuitive pulse shapes that humans or simple optimizers would miss."}]} +{"conversations": [{"from": "human", "value": "What is the 'Manifold Learning' approach used by CEA for turbulent flow classification?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Complexity**: Turbulence exists on a manifold (a low-dimensional structure within high-dimensional space).\n2. **Goal**: Classify whether a mixing zone is in the 'linear,' 'non-linear,' or 'fully turbulent' regime.\n3. **ML Method**: Use techniques like UMAP or t-SNE to map the state of a CEA shock-tube experiment onto a visual map for researchers.\n\n### Final Answer\n**Manifold Learning** at **CEA** is used to categorize the state of a hydrodynamic instability. By projecting complex fluid states into a lower-dimensional map, researchers can identify the exact moment an instability **transitions to turbulence**, which is the point where traditional 1D codes usually fail and ML-enhanced models must take over."}]} +{"conversations": [{"from": "human", "value": "How do Belof's 'Digital Twins' help in the quantification of Margin and Uncertainty (QMU) for HEDP?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **QMU**: The science of determining how much 'margin' a system has before it fails.\n2. **Digital Twin**: A high-fidelity ML surrogate that mirrors a specific, physical NIF target.\n3. **Application**: By running the 'Twin' with the exact metrology data (measured bumps/scratches) of the real capsule, researchers can predict if that *specific* capsule will ignite or if its defects are too large.\n\n### Final Answer\n**Digital Twins** enhance **QMU** by providing a specific prediction for every physical target. Instead of relying on general 'average' expectations, Belof's approach uses ML to incorporate the **real-world manufacturing defects** of a capsule into the simulation, allowing for a far more accurate assessment of the risk posed by instabilities on a shot-by-shot basis."}]} +{"conversations": [{"from": "human", "value": "Explain the role of 'Generative Adversarial Networks' (GANs) in creating synthetic X-ray images of capsule implosions."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Generator**: Creates fake X-ray images of an imploding core.\n2. **Discriminator**: Tries to tell if the image is from a real HYDRA simulation or the Generator.\n3. **Outcome**: The GAN learns to produce incredibly realistic synthetic data that captures the 'noisy' and 'distorted' nature of real X-ray diagnostics.\n\n### Final Answer\n**GANs** are used to generate **synthetic diagnostic data**. At labs like LLNL, they help train automated 'shape-recognition' algorithms; by creating thousands of realistic but 'fake' X-ray images of unstable cores, GANs allow researchers to train computer vision models to identify instability signatures in real NIF experimental data."}]} +{"conversations": [{"from": "human", "value": "How does Benoit-Joseph Gr\u00e9a's work on 'Reynolds-Averaged Navier-Stokes' (RANS) closures benefit from ML?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **RANS limitation**: Standard models (like $k-\\\\epsilon$) use 'universal' constants that fail in the extreme acceleration of HEDP.\n2. **ML Correction**: A neural network is used to 'learn' local, variable constants based on the specific Atwood number and Mach number of the flow.\n\n### Final Answer\nML is used to develop **non-universal RANS closures**. Gr\u00e9a\u2019s research at **CEA** suggests that since HEDP turbulence is highly transient, a 'one-size-fits-all' constant is incorrect; ML models can instead provide **spatially and temporally dependent coefficients** that make 2D and 3D hydrodynamics codes much more accurate in the turbulent regime."}]} +{"conversations": [{"from": "human", "value": "In Belof's 'CogSim' framework, what is 'Uncertainty Quantification' (UQ) and why is it essential for the 2022 NIF ignition milestone?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Ignition context**: The 2022 breakthrough required perfect alignment of many variables.\n2. **UQ's Role**: ML models provided a 'probability' of ignition by accounting for laser energy fluctuations and instability growth.\n3. **Significance**: It allowed the team to know they were in a 'high-probability' regime rather than just being lucky.\n\n### Final Answer\n**Uncertainty Quantification (UQ)** within the **CogSim** framework provides a safety buffer. It was essential for the NIF ignition because it allowed designers to choose a target and pulse shape that was **'tolerant' of small errors**, ensuring that hydrodynamic instabilities wouldn't grow enough to kill the reaction even if the laser pulse was slightly off-spec."}]} +{"conversations": [{"from": "human", "value": "What is 'Surrogate-Assisted Design' for Hohlraums?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Complexity**: Hohlraum physics involves LPI, wall expansion, and radiation transport.\n2. **Surrogate**: A fast ML model trained on a subset of full Rad-Hydro simulations.\n3. **Design**: The surrogate suggests the optimal hohlraum length and gas-fill density to ensure the most symmetric (and thus most stable) drive for the capsule.\n\n### Final Answer\n**Surrogate-Assisted Design** uses ML to replace the 'trial-and-error' method of hohlraum engineering. By using a fast-executing neural network to predict X-ray symmetry, designers can explore **billions of hohlraum shapes** in the time it would take to run a single traditional simulation, leading to the discovery of highly optimized, stable configurations."}]} +{"conversations": [{"from": "human", "value": "How does 'Feature Importance' (SHAP values) help HEDP physicists understand instability drivers?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Black Box Problem**: NNs often provide a result without explaining 'why.'\n2. **SHAP (SHapley Additive exPlanations)**: A math method to see which input (e.g., peak power, ablator thickness) had the most impact on the output (e.g., mix mass).\n3. **HEDP insight**: Allows physicists to confirm that the ML model is picking up on real physics (like RTI) rather than numerical artifacts.\n\n### Final Answer\n**SHAP values** are used to 'open the black box' of ML in HEDP. They allow researchers like those in Belof's group to see which **experimental parameters** are the strongest drivers of hydrodynamic instability, providing physical insight that can be used to manually refine future capsule designs."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Data-Driven' approach to Equation of State (EOS) modeling in HEDP."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Theoretical Gaps**: Analytic EOS models often struggle in the 'warm dense matter' regime.\n2. **ML Approach**: Use Gaussian Process Regression (GPR) to interpolate between high-precision QMD (Quantum Molecular Dynamics) data points.\n3. **Result**: A smoother, more accurate EOS table for hydro-codes to use.\n\n### Final Answer\n**Data-Driven EOS modeling** uses ML to create high-fidelity pressure-density tables. By using **Gaussian Processes** to bridge the gap between experimental data and theoretical calculations, researchers can provide hydro-codes with a more accurate 'map' of material behavior, which is critical for correctly predicting shock speeds and RMI growth."}]} +{"conversations": [{"from": "human", "value": "What is 'Graph Neural Networks' (GNN) and how could they be applied to the unstructured meshes of HEDP codes?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Standard CNNs**: Require a regular pixel grid (like an image).\n2. **HEDP Meshes**: Often unstructured or ALE-based (nodes and edges).\n3. **GNNs**: Specifically designed to work on graphs (nodes connected by edges), making them a natural fit for predicting fluid flow across a complex computational mesh.\n\n### Final Answer\n**Graph Neural Networks (GNNs)** are a promising tool for HEDP because they can operate directly on the **unstructured grids** of hydrodynamics codes. This allows an ML model to predict the evolution of an instability at each mesh vertex, potentially acting as a super-fast accelerator for traditional Lagrangian or Eulerian solvers."}]} +{"conversations": [{"from": "human", "value": "Explain 'Anomaly Detection' in the context of NIF target metrology."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Metrology**: Inspecting the capsule with microscopes and X-rays before the shot.\n2. **Anomaly**: Finding a defect that is unusual (e.g., a 'void' in the diamond layer).\n3. **ML Role**: An unsupervised ML model is trained on 'perfect' capsules; it flags any target that deviates from this norm as a high-risk shot.\n\n### Final Answer\n**ML-based Anomaly Detection** is used to identify **'rogue' targets** before they are shot. By automatically analyzing thousands of metrology images, the AI can flag microscopic defects that are statistically likely to trigger devastating hydrodynamic instabilities, saving millions of dollars in 'lost' shots."}]} +{"conversations": [{"from": "human", "value": "How does CEA's Benoit-Joseph Gr\u00e9a define the 'Turbulent Potential' of an interface using ML?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Metric**: A way to quantify how 'close' an interface is to breaking up into chaos.\n2. **ML Tool**: A classifier trained on the growth of the mix-width $\\\\dot{h}$.\n3. **Definition**: If the ML identifies the onset of the 'late-time' self-similar growth phase, the interface is said to have reached its 'turbulent potential.'\n\n### Final Answer\nIn **CEA's framework**, ML helps define the **onset of self-similarity**. By tracking the growth rate of perturbations, ML models can predict when an interface has enough 'Turbulent Potential' to transition from discrete bubbles and spikes into a fully developed mix zone, which is critical for calculating the final fuel purity in a fusion shot."}]} +{"conversations": [{"from": "human", "value": "Define 'Active Learning' in the context of generating HEDP training data."}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Loop**: You have a surrogate model that is 'uncertain' in some regions of the design space.\n2. **Action**: The AI 'chooses' the next set of parameters for a full 3D HYDRA simulation to run.\n3. **Outcome**: The model improves its accuracy using the minimum number of expensive simulations.\n\n### Final Answer\n**Active Learning** is a 'smart' way to build datasets. Instead of running simulations randomly, the AI **identifies gaps in its own knowledge** and requests specific, high-value simulations in those regions. This is how Belof's group at LLNL can build world-class surrogate models using only a few thousand simulations instead of millions."}]} +{"conversations": [{"from": "human", "value": "What is the 'Latent Space' of an ICF implosion?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Physical Space**: 3D coordinates, $P, \rho, T$.\n2. **Latent Space**: A highly compressed version (e.g., 10 variables) that captures the essence of the implosion (e.g., 'implosion velocity', 'mode 2 asymmetry', 'picket strength').\n3. **Utility**: It's easier to find stability 'sweet spots' in a 10D latent space than a million-dimensional mesh space.\n\n### Final Answer\nThe **Latent Space** is the compressed, essential representation of an experiment. By using ML to reduce an implosion to its core physical 'drivers,' researchers can visualize the complex trade-offs between **stability and compression** on a simple graph, making it easier to navigate toward ignition-capable designs."}]} +{"conversations": [{"from": "human", "value": "How do ML models help resolve the 'Ablation Front' without using an ultra-fine mesh?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Constraint**: The ablation front is where the density changes by orders of magnitude over microns.\n2. **ML Solution**: A 'Super-Resolution' network trained to 'predict' the sub-grid density profile based on the coarse-grid values.\n\n### Final Answer\nML is used for **Numerical Super-Resolution**. By training a network on ultra-high-resolution 1D data, a standard 2D code can use ML to **reconstruct the sharp ablation front** on a coarse mesh, allowing for the simulation of RTI growth at a fraction of the usual computational cost."}]} +{"conversations": [{"from": "human", "value": "Explain the use of 'Clustering Algorithms' (like K-means) in HEDP image analysis."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Diagnostic Output**: A grainy X-ray image of a stagnated core.\n2. **Clustering**: Groups pixels with similar intensities or textures.\n3. **Result**: Automatically separates the 'Hotspot' from the 'Ablator' and 'Mix Zone,' allowing for objective measurements of the mix area.\n\n### Final Answer\n**Clustering Algorithms** are used for **automated segmentation** of experimental data. They remove human bias from the analysis of NIF shots by objectively defining the boundaries of the hotspot and the mix zone, which is critical for accurately calculating the 'Mix Mass' and its impact on the energy balance."}]} +{"conversations": [{"from": "human", "value": "Describe 'Physics-Constrained' GANs (PC-GANs) for generating shock profiles."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Problem**: Standard GANs can generate images that look like shocks but violate the Rankine-Hugoniot conditions.\n2. **Constraint**: The GAN\u2019s discriminator is modified to penalize any output that doesn't solve the jump equations.\n\n### Final Answer\n**Physics-Constrained GANs** generate synthetic data that is **guaranteed to be physically valid**. In HEDP, this means the generated shock profiles always satisfy the **Rankine-Hugoniot relations**, making them useful for training other ML models when real simulation data is scarce."}]} +{"conversations": [{"from": "human", "value": "How does LLNL use 'Convolutional Neural Networks' (CNNs) to predict SRS/SBS (Laser-Plasma Interaction) thresholds?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **LPI**: Very fast, small-scale physics (SRS/SBS) that ruins hohlraum performance.\n2. **CNN**: Excellent at recognizing spatial patterns (like the filaments in a laser beam).\n3. **Prediction**: The CNN analyzes the 'intensity map' of the laser beam and predicts if a specific hohlraum plasma will trigger backscatter instabilities.\n\n### Final Answer\n**CNNs** are used as **early-warning systems for LPI**. By analyzing the spatial and temporal intensity profiles of the NIF lasers, these models can predict the likelihood of **Stimulated Raman Scattering (SRS)**, allowing physicists to preemptively adjust the hohlraum gas fill or pulse shape to avoid energy losses."}]} +{"conversations": [{"from": "human", "value": "What is the 'Inverse Problem' in ICF and how does ML solve it?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Forward Problem**: Inputs (laser/capsule) $\to$ Output (yield/X-ray image).\n2. **Inverse Problem**: Desired Output (ignition) $\to$ Required Inputs.\n3. **ML Solution**: An 'Inverse Neural Network' that can suggest the exact capsule and pulse design needed to reach a specific target temperature and density.\n\n### Final Answer\nML solves the **Inverse Problem** by working backward from a goal. Instead of guessing a design and checking its yield, the **Inverse Model** allows researchers to input the 'perfect' ignition results, and the AI suggests the **optimal laser pulse and target dimensions** required to achieve it, significantly accelerating the design cycle."}]} +{"conversations": [{"from": "human", "value": "Explain 'Transfer Learning' across different facilities (e.g., from OMEGA to NIF)."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Omega (60 beams)**: Smaller, runs hundreds of shots per year (lots of data).\n2. **NIF (192 beams)**: Massive, runs fewer shots (less data).\n3. **Transfer**: Train a model on the 'physics' of the smaller OMEGA shots and 'transfer' that knowledge to predict the performance of the larger NIF shots.\n\n### Final Answer\n**Cross-facility Transfer Learning** leverages the high shot-rate of the **OMEGA laser** to improve predictions for the **NIF**. Since the underlying hydrodynamics of RTI and RMI are the same, a model can learn the scaling laws on small targets and apply that 'intuition' to ignition-scale experiments where data is much harder to obtain."}]} +{"conversations": [{"from": "human", "value": "What is 'Sensitivity Analysis' in the context of Belof's CogSim architecture?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Goal**: Determine which parameter 'breaks' the experiment first.\n2. **ML Method**: Use the surrogate model to run a 'Sobol sequence' of millions of variations.\n3. **Insight**: Finds that, for example, a 2% tilt in the hohlraum is more dangerous than a 5% error in laser power.\n\n### Final Answer\n**Sensitivity Analysis** identify the **'critical failure points'** of a design. Using Belof's CogSim tools, physicists can determine which specific manufacturing or laser tolerances are the most likely to amplify hydrodynamic instabilities, allowing the engineering team to focus their precision efforts where they matter most."}]} +{"conversations": [{"from": "human", "value": "Define 'Ensemble Modeling' and its use in predicting the 'Ignition Cliff.'"}, {"from": "gpt", "value": "### Reasoning Process\n1. **The Cliff**: The sharp drop-off in yield if conditions aren't perfect.\n2. **Ensemble**: Using 10 or 20 different ML models (CNNs, Random Forests, XGBoost) and averaging their predictions.\n3. **Benefit**: Reduces the chance that a single model's 'blind spot' leads to a false prediction of ignition.\n\n### Final Answer\n**Ensemble Modeling** uses a 'committee' of AI models to predict the **Ignition Cliff**. By combining the strengths of different architectures, researchers at LLNL can create a more robust 'probability map' of success, ensuring that a design only proceeds to a shot if multiple independent ML models agree it will remain stable."}]} +{"conversations": [{"from": "human", "value": "How does CEA use ML to optimize the 'Internal Structure' of foam-based targets for Lab Astro?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Foams**: Used to study supernova shocks; their 'pore size' affects the shock front.\n2. **Optimization**: A generative model suggests new, non-uniform foam geometries.\n3. **Suppression**: These 'designed' foams can intentionally break up or smooth out a shock to create a specific, stable density profile for the experiment.\n\n### Final Answer\n**CEA** uses generative ML to design **engineered foam targets**. These micro-structured materials are optimized to 'dampen' hydrodynamic instabilities as a shock passes through them, allowing for a cleaner study of laboratory astrophysics phenomena like supernova remnant expansion."}]} +{"conversations": [{"from": "human", "value": "In the 'Digital Twin' paradigm, what is 'In-situ' data analysis?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Traditional**: Run simulation $\to$ Save data $\to$ Analyze later.\n2. **In-situ**: The ML model runs *inside* the simulation code as it executes.\n3. **Benefit**: The AI can detect a developing instability in real-time and 'flag' it for the researcher, or even adjust the mesh resolution to capture the fine details of the mix zone.\n\n### Final Answer\n**In-situ ML analysis** occurs while the simulation is running. This allows for **Real-time Instability Detection**, where the AI monitors the growing RTI bubbles and Spike-amplitude; if it detects a critical failure mode, it can automatically trigger higher-fidelity diagnostics or mesh refinement in that specific region, saving massive amounts of compute time."}]} +{"conversations": [{"from": "human", "value": "Explain the 'Flux Limiter' (e.g., Levermore-Pomraning) in the context of the diffusion approximation."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Diffusion Limit Failure**: In optically thin regions, the standard diffusion equation predicts infinite signal propagation speed ($F = -D \nabla E$).\n2. **Physical Limit**: Realistically, the radiation flux $F$ cannot exceed $cE$ (the free-streaming limit).\n3. **The Fix**: A flux limiter $\\\\lambda$ is introduced to modify the diffusion coefficient such that as the gradient becomes large (optically thin), $F$ asymptotically approaches $cE$.\n\n### Final Answer\nA **Flux Limiter** is a numerical 'patch' that prevents the diffusion approximation from predicting **supersonic radiation transport** in optically thin regions. It ensures that the calculated flux never exceeds the physical speed of light, which is critical for correctly modeling the Laser Entrance Hole (LEH) environment."}]} +{"conversations": [{"from": "human", "value": "What is 'Operator Splitting' in a Rad-Hydro code and what are the associated risks?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: Solving the hydrodynamics, heat conduction, and radiation transport in separate, sequential steps within a single timestep.\n2. **Implementation**: First update $\rho, u$ (Hydro), then update $T$ (Conduction), then update $E_r$ (Radiation).\n3. **Risk**: If the coupling between radiation and matter is strong (e.g., in a shock), splitting can introduce 'splitting errors' or numerical instabilities unless the steps are sub-cycled or iterated for consistency.\n\n### Final Answer\n**Operator Splitting** breaks down the complex coupled system into solvable sub-problems. The primary risk is **numerical decoupling**, where the matter and radiation energy exchange is lagged by one step, potentially leading to non-physical oscillations or 'energy leaks' in regions with high optical depth."}]} +{"conversations": [{"from": "human", "value": "Describe the 'Sn' (Discrete Ordinates) method for solving the Radiation Transport Equation (RTE)."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Discretization**: Unlike diffusion (which uses energy density), $S_n$ discretizes the angular direction of radiation into $n$ specific 'ordinates' or rays.\n2. **Accuracy**: It provides a more accurate solution than diffusion in the 'translucent' regime ($\tau \\\\approx 1$).\n3. **Cost**: Computational complexity scales with the number of angles, making $S_8$ or $S_{16}$ significantly more expensive than a simple diffusion solver.\n\n### Final Answer\nThe **$S_n$ Discrete Ordinates method** solves the RTE by tracking radiation along a finite set of discrete angles. It is superior to diffusion for modeling **anisotropic radiation fields**, such as the direct 'line-of-sight' heating from laser spots on a hohlraum wall."}]} +{"conversations": [{"from": "human", "value": "In Lagrangian hydrodynamics, what is 'Mesh Tangling' and why is it common in ICF implosion simulations?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Lagrangian Definition**: The computational grid moves with the fluid mass.\n2. **Convergent Flow**: In ICF, the capsule shrinks by a factor of 30. As zones compress, their aspect ratios become extreme.\n3. **Tangling**: High-shear areas or Rayleigh-Taylor 'fingers' can cause grid vertices to cross over each other, creating negative volumes.\n4. **Solution**: Use ALE (Arbitrary Lagrangian-Eulerian) methods to occasionally 'relax' or remap the mesh.\n\n### Final Answer\n**Mesh Tangling** occurs when the moving grid cells become highly distorted or inverted. It is frequent in ICF due to the **extreme convergence and hydrodynamic instabilities**; if the grid isn't periodically re-aligned (using ALE), the simulation will crash due to mathematical singularities in the zone volume calculations."}]} +{"conversations": [{"from": "human", "value": "Explain 'Artificial Viscosity' (e.g., von Neumann-Richtmyer) and its necessity in shock capturing."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Shock Discontinuity**: Shocks are mathematically zero-width jumps. Digital grids cannot represent a true discontinuity.\n2. **Oscillations**: Without a fix, shocks cause 'Gibbs phenomenon' (ringing/oscillations) behind the front.\n3. **Mechanism**: Artificial viscosity adds a dissipative term that 'smears' the shock over 2-3 zones, allowing the code to resolve the jump pressure stably.\n\n### Final Answer\n**Artificial Viscosity** is a numerical term added to the momentum and energy equations to **stabilize shock fronts**. It converts kinetic energy into internal energy across a few grid cells, preventing non-physical oscillations and ensuring the simulation obeys the Rankine-Hugoniot jump conditions."}]} +{"conversations": [{"from": "human", "value": "What is 'Multi-Group Diffusion' and how does it differ from 'Grey Diffusion'?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Grey Diffusion**: Assumes all radiation shares a single average opacity and temperature (one energy bin).\n2. **Multi-Group**: Divides the X-ray spectrum into discrete frequency bins (groups), each with its own opacity $\\\\kappa_\nu$.\n3. **Physics**: Necessary for ICF because high-energy 'hard' X-rays (M-band) have much lower opacity than 'soft' thermal X-rays.\n\n### Final Answer\n**Multi-Group Diffusion** tracks radiation across multiple energy bins rather than a single 'Grey' average. This is critical for ICF to correctly model **pre-heat**, as it allows the code to distinguish between the soft X-rays driving the ablation and the hard X-rays that penetrate deep into the fuel."}]} +{"conversations": [{"from": "human", "value": "Define 'Z-layering' (or material zoning) in an ICF target simulation."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Multi-material Setup**: ICF targets have distinct layers (Be/HDC ablator, DT ice, DT gas).\n2. **Interface Tracking**: The code must handle zones containing two different materials ('mixed zones').\n3. **EOS Coupling**: Each material must be linked to its specific SESAME or lookup table to ensure the correct pressure response.\n\n### Final Answer\n**Z-layering** refers to the initialization of different material properties across the mesh. Accurate zoning is essential for capturing the **refraction and reflection of shocks** at material interfaces, such as the transition from the plastic ablator to the cryogenic DT fuel."}]} +{"conversations": [{"from": "human", "value": "What is the 'Courant Condition' (CFL) for a 1D hydrodynamics code?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Physical Limit**: Information (sound waves) cannot travel further than one grid cell ($\\\\Delta x$) in a single timestep ($\\\\Delta t$).\n2. **Formula**: $\\\\Delta t \\\\leq C \\\\cdot \frac{\\\\Delta x}{u + c_s}$, where $C$ is the Courant number ($<1$).\n3. **Constraint**: If violated, the code becomes unstable as it tries to 'skip' the physical interactions happening between cells.\n\n### Final Answer\nThe **CFL condition** limits the timestep $\\\\Delta t$ based on the local sound speed and fluid velocity. In ICF simulations, the timestep often drops to **femtoseconds** during peak compression because the sound speed $c_s$ becomes extremely high as the plasma heats to millions of degrees."}]} +{"conversations": [{"from": "human", "value": "Describe 'Ray Tracing' in the context of laser energy deposition in an ICF code."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Energy Source**: The laser is an external source of energy.\n2. **Propagation**: The code tracks 'rays' through the plasma mesh.\n3. **Absorption**: Energy is deposited via Inverse Bremsstrahlung as the ray passes through zones with specific electron densities $n_e$ and temperatures $T_e$.\n4. **Refraction**: Rays bend according to the gradient of the refractive index $\nabla \\\\eta$.\n\n### Final Answer\n**Ray Tracing** is the algorithm used to simulate **laser propagation and absorption**. It tracks thousands of geometric rays through the plasma, calculating how much energy is absorbed in each cell and how the beam 'bends' due to density gradients in the hohlraum gas."}]} +{"conversations": [{"from": "human", "value": "Why is 'Electron Thermal Conduction' often modeled using a flux-limited Spitzer-H\u00e4rm model?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Spitzer-H\u00e4rm**: Classical heat conduction $q = -\\\\kappa \nabla T$, where $\\\\kappa \\\\propto T^{5/2}$.\n2. **The Problem**: In HEDP, temperature gradients are so steep that the model can predict heat flux higher than the 'electron thermal limit' (all electrons moving at the thermal speed).\n3. **The Fix**: A 'flux limiter' (typically $f=0.06$) is applied to cap the heat flow at a physical maximum.\n\n### Final Answer\nThe **Flux-limited Spitzer model** is used because classical conduction overestimates heat flow in the presence of steep HEDP gradients. A **limit factor (f-norm)** is applied to ensure the heat flux remains physically consistent with the maximum energy the electron population can actually carry."}]} +{"conversations": [{"from": "human", "value": "Explain 'In-line Opacity' calculation vs. 'Table-Lookup' in Rad-Hydro codes."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Table-Lookup**: Pre-calculated opacities (e.g., TOPS) are stored in a file. The code interpolates $(\rho, T)$. Fast but less flexible.\n2. **In-line**: The code solves atomic physics (Saha/Boltzmann) every timestep to find the opacity. Slow but allows for non-LTE (Local Thermodynamic Equilibrium) effects.\n3. **Hybrid**: Modern codes often use tables for the bulk and in-line for specific tracer dopants.\n\n### Final Answer\n**Table-Lookup** provides computational speed by using pre-calculated data, while **In-line calculation** offers higher physical fidelity for non-equilibrium plasmas. Most ICF ignition simulations rely on high-quality tables to handle the complex gold M-band spectra efficiently."}]} +{"conversations": [{"from": "human", "value": "What is the 'P1 Approximation' and how does it relate to the Eddington closure?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **RTE Expansion**: Expand radiation intensity $I$ in spherical harmonics.\n2. **Trunaction**: Keep only the first two terms ($\\\\ell=0, 1$). This yields equations for energy density and flux.\n3. **Closure**: Requires a relationship between pressure and energy density ($P = fE$). The Eddington factor $f=1/3$ is the simplest closure.\n\n### Final Answer\nThe **$P_1$ Approximation** is a moment-based method for solving radiation transport. It assumes the radiation field is nearly isotropic, leading to a set of hyperbolic equations that are more accurate than simple diffusion in modeling the 'start-up' of radiation flow."}]} +{"conversations": [{"from": "human", "value": "In 3D ICF simulations, what is 'Hourglassing' and how is it controlled?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Numerical Error**: Occurs in staggered-mesh Lagrangian codes.\n2. **Pattern**: Cells distort into a 'bowtie' or 'hourglass' shape without any change in volume or internal energy, meaning the physics solver 'doesn't feel it.'\n3. **Control**: Artificial 'Hourglass Resistance' (stiffness or damping) is added to the nodes to penalize these non-physical distortions.\n\n### Final Answer\n**Hourglassing** is a non-physical mesh distortion that carries zero energy. It is controlled by adding **numerical damping forces** that resist the 'twisting' of cells, ensuring the grid remains representative of the physical plasma volume during high-compression implosions."}]} +{"conversations": [{"from": "human", "value": "How do codes handle 'Equations of State' (EOS) at the material interface between high-Z and low-Z materials?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Mixed Zones**: Zones containing multiple materials (e.g., Au and He).\n2. **Pressure Equilibrium**: Most codes assume all materials in a zone share the same pressure and temperature.\n3. **Mixing Rules**: The code calculates a weighted average of the internal energies or uses an 'Amagat's Law' volume-addition approach to determine the zone's total response.\n\n### Final Answer\nAt material interfaces, codes use **Mixed-Zone Models** to blend the EOS of different materials. The code typically enforces **pressure and temperature equilibrium** within the cell, using the mass-weighted properties of the constituents to determine the hydrodynamic response of the interface."}]} +{"conversations": [{"from": "human", "value": "What is 'Sub-cycling' in the context of radiation transport solvers?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Time Scales**: Radiation often evolves faster than hydrodynamics.\n2. **Technique**: For one 'Hydro' timestep, the code may run 10 or 100 'Radiation' timesteps.\n3. **Efficiency**: This allows the code to maintain stability in the radiation field without forcing the expensive hydro calculations (like mesh remapping) to happen at the same high frequency.\n\n### Final Answer\n**Sub-cycling** allows the radiation solver to take multiple small steps for every single hydrodynamic step. This **maximizes efficiency** by only applying the most rigorous time-constraints to the physics modules that require them, rather than slowing down the entire simulation code."}]} +{"conversations": [{"from": "human", "value": "Define 'Conservative' vs. 'Non-Conservative' forms of the hydrodynamics equations in simulation codes."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Conservative**: Solves for $\rho, \rho u, E$ (Mass, Momentum, Total Energy). It naturally ensures that these quantities are perfectly conserved across the mesh.\n2. **Non-Conservative**: Solves for $u, T, P$. Easier to code but can 'lose' energy during shock propagation or mesh remapping.\n3. **Preference**: HEDP codes almost always use conservative forms to ensure the massive energy of the laser is correctly tracked.\n\n### Final Answer\n**Conservative forms** solve for the fundamental quantities like total energy and momentum directly. They are required for HEDP to ensure **perfect energy balance**; a non-conservative code might 'create' or 'destroy' energy at a shock front, leading to incorrect predictions of fusion yield."}]} +{"conversations": [{"from": "human", "value": "What is the 'Multi-material ALE' (Arbitrary Lagrangian-Eulerian) method?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Lagrange Step**: Mesh moves with the fluid (good for tracking interfaces).\n2. **Remesh Step**: If cells get too distorted, a new, cleaner mesh is created.\n3. **Remap Step**: The mass, momentum, and energy from the old mesh are 'mapped' onto the new mesh using advection algorithms.\n\n### Final Answer\n**Multi-material ALE** combines the benefits of tracking interfaces (Lagrangian) with the ability to handle large distortions (Eulerian). It is the 'gold standard' for ICF simulations, allowing the code to track the capsule layers accurately until the very high-convergence stagnation phase."}]} +{"conversations": [{"from": "human", "value": "Explain the role of 'Atomic Kinetic' models (like DCA) in Rad-Hydro codes."}, {"from": "gpt", "value": "### Reasoning Process\n1. **LTE vs. non-LTE**: In low-density hohlraum plasma, the matter and radiation are not in equilibrium.\n2. **DCA (Detailed Configuration Accounting)**: Instead of a simple average $Z$, the code tracks the population of every electronic state of the gold ions.\n3. **Coupling**: This provides much more accurate X-ray emission and absorption rates for the hohlraum drive.\n\n### Final Answer\n**Atomic Kinetic models** like DCA track the detailed population of ionic states. They are essential for modeling **non-LTE hohlraum plasmas**, where the standard Saha equation fails to predict the correct X-ray spectrum produced by the laser-heated gold walls."}]} +{"conversations": [{"from": "human", "value": "How do simulations model 'Neutron Transport' differently from 'Radiation Transport'?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Radiation**: Highly coupled to matter; photons have a short mean-free path ($\tau \\\\gg 1$). Uses diffusion.\n2. **Neutrons**: Long mean-free path; they rarely interact with the plasma except at the very highest densities ($\rho R > 0.3$).\n3. **Method**: Neutrons are usually tracked using Monte Carlo methods or very high-order $S_n$ transport because they 'stream' out of the hotspot.\n\n### Final Answer\n**Neutron Transport** is typically solved using **Monte Carlo or high-order $S_n$** because neutrons are almost entirely non-collisional (optically thin). Unlike radiation, which diffuses through the plasma, neutrons stream directly to the diagnostics, only losing energy in the dense 'cold fuel' shell."}]} +{"conversations": [{"from": "human", "value": "Describe 'Parallel Scaling' challenges in 3D Rad-Hydro codes."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Domain Decomposition**: The 3D grid is split across thousands of CPUs.\n2. **Communication**: Hydrodynamics only needs to talk to 'neighbor' cells. Radiation diffusion is a 'global' problem; every cell can potentially affect every other cell.\n3. **Bottleneck**: The implicit matrix solver for radiation transport often becomes the bottleneck, requiring massive 'all-to-all' data transfers across the supercomputer.\n\n### Final Answer\n**Parallel Scaling** is limited by the **implicit radiation solver**. While hydrodynamic movements are local and scale well, the global nature of radiation diffusion requires intensive communication between all processors, often dictating the maximum number of cores a simulation can efficiently use."}]} +{"conversations": [{"from": "human", "value": "What is 'Energy Deposition' in a Monte Carlo radiation solver?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Stochastic Tracking**: Photons are launched as 'packets' (random walk).\n2. **Interaction**: When a packet is 'absorbed' in a cell, its energy is added to the cell's internal energy $e$.\n3. **Statistical Noise**: If too few packets are used, the energy deposition is 'patchy,' leading to non-physical temperature spikes.\n\n### Final Answer\nIn **Monte Carlo solvers**, energy deposition is the process of transferring energy from tracked photon packets to the fluid mesh. The primary challenge is **minimizing statistical noise**, as low packet counts can seed 'numerical' instabilities that look like physical turbulence but are actually artifacts of the random sampling."}]} +{"conversations": [{"from": "human", "value": "Explain the significance of 'Double Precision' (64-bit) in HEDP codes."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Dynamic Range**: HEDP involves densities from $10^{-6}$ to $10^3$ g/cc and temperatures from $0.02$ to $10^4$ eV.\n2. **Accumulation**: In 100,000+ timesteps, small rounding errors in 32-bit floats would accumulate into massive energy imbalances.\n3. **Requirement**: Conservative laws cannot be maintained with 32-bit precision over the timescales of an ICF implosion.\n\n### Final Answer\n**Double Precision** is mandatory because of the **extreme dynamic range** of HEDP. Without 64-bit calculations, numerical 'drift' would violate the conservation of energy and mass, rendering the simulation results for fusion yield completely unreliable."}]} +{"conversations": [{"from": "human", "value": "What is 'Initial Condition (IC) Perturbation' in RTI simulations?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Seeding**: Instabilities need a 'seed' to grow. \n2. **Method**: Code developers manually add a small sine-wave or 'white noise' variation to the interface position or density.\n3. **Validation**: This allows the code to be compared against analytical growth rates ($\\\\gamma = \\\\sqrt{Akg}$) to ensure the hydro-solver is accurate.\n\n### Final Answer\n**IC Perturbations** are intentional, microscopic 'wrinkles' added to the capsule surface in a simulation. They are used to **seed instabilities** like Rayleigh-Taylor, allowing researchers to study how initial target defects will grow and eventually disrupt the fusion burn during stagnation."}]} +{"conversations": [{"from": "human", "value": "Define 'Post-Processing' in the context of a 3D NIF simulation."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Raw Data**: The code outputs $\rho, T, u, Z$ in billions of cells.\n2. **Synthetic Diagnostics**: Separate codes (like SPECT3D) take this data and 'simulate' what a real-world camera or spectrometer would see.\n3. **Comparison**: This allows the 'synthetic' yield and X-ray images to be compared directly to the 'real' experimental data.\n\n### Final Answer\n**Post-Processing** involves running 'Synthetic Diagnostic' codes on the raw simulation data. This creates **simulated experimental outputs** (like X-ray images or neutron spectra), which are the only valid way to compare a complex 3D simulation to the actual data recorded during a shot at the NIF."}]} +{"conversations": [{"from": "human", "value": "What is a 'Marshak Wave' and how does its propagation velocity compare to a standard hydrodynamic shock?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: A Marshak wave is a non-linear radiation diffusion wave that propagates into cold material.\n2. **Physics**: It occurs when radiation pressure or energy density dominates. The front moves as $x_f \\\\\\\\propto \\\\\\\\sqrt{t}$ (diffusive scaling).\n3. **Velocity Comparison**: Initially, at high temperatures, the Marshak wave is **supersonic**\u2014it moves faster than the material's sound speed $c_s$, meaning the material is heated before it can move.\n4. **Evolution**: As the wave cools, it slows down. Eventually, the sound speed catches up, and the radiation front 'shocks up,' transitioning into a radiation-driven hydrodynamic shock.\n\n### Final Answer\nA **Marshak Wave** is a supersonic heat front driven by radiation diffusion. Unlike a standard shock wave, which involves a discrete jump in density and mass motion, a Marshak wave (in its early phase) heats the material in place without significantly displacing it. In ICF, this wave is what 'soaks' into the capsule ablator to start the implosion process."}]} +{"conversations": [{"from": "human", "value": "Explain the significance of the 'Eddington Approximation' in radiation hydrodynamics codes."}, {"from": "gpt", "value": "### Reasoning Process\n1. **Problem**: The radiation intensity $I$ depends on position, time, AND direction (anisotropy).\n2. **The Approximation**: Assume the radiation field is nearly isotropic. This allows us to relate the radiation pressure tensor $P_{ij}$ to the radiation energy density $E_r$.\n3. **Mathematical Form**: $P_{ij} = \\\\\frac{1}{3} E_r \\\\\\\\delta_{ij}$.\n4. **Result**: This 'closes' the moment equations of the RTE, turning a complex integro-differential equation into a simpler set of fluid-like equations (the $P_1$ or $M_1$ models).\n\n### Final Answer\nThe **Eddington Approximation** allows us to treat radiation as a fluid with a specific pressure ($P = E/3$). It is essential for computational efficiency in HEDP codes, enabling the coupling of radiation energy to the momentum equation of the plasma without tracking every individual photon trajectory."}]} +{"conversations": [{"from": "human", "value": "In a radiation-dominated shock, explain the structure of the 'Radiative Precursor.'"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Shock Setup**: A very strong shock (Mach > 10) creates a massive temperature jump.\n2. **Radiation Leakage**: The hot post-shock plasma emits intense X-rays. Because the upstream material is not perfectly opaque, these photons travel ahead of the physical shock front.\n3. **Pre-heating**: These photons are absorbed by the upstream 'cold' material, raising its temperature before the shock actually arrives.\n4. **Profile**: This leads to a gradual temperature increase ahead of the density jump, known as the radiative precursor.\n\n### Final Answer\nA **Radiative Precursor** is a region of heated material ahead of a shock front caused by photons escaping from the hot post-shock region. In HEDP experiments (like laser-driven shocks in foams), this precursor can change the compressibility of the material, effectively 'softening' the shock transition."}]} +{"conversations": [{"from": "human", "value": "What is 'Radiation Pressure' and at what energy density does it become comparable to material pressure in a gold plasma at 300 eV?"}, {"from": "gpt", "value": "### Reasoning Process\n1. **Formula**: Radiation pressure $P_r = \\\\\frac{a T^4}{3}$, where $a \\\\\\\\approx 7.56 \\\\\times 10^{-15} \\\\\text{ erg/cm}^3\\\\\text{K}^4$.\n2. **Conversion**: $300 \\\\\text{ eV} \\\\\\\\approx 3.48 \\\\\times 10^6 \\\\\text{ K}$.\n3. **Calculation**: $P_r = \\\\\frac{1}{3} (7.56 \\\\\times 10^{-15}) (3.48 \\\\\times 10^6)^4 \\\\\\\\approx 3.7 \times 10^{11} \\\\\text{ dynes/cm}^2 \\\\\\\\approx 0.37 \\\\\text{ Mbar}$.\n4. **Comparison**: In a typical NIF hohlraum ($T \\\\\\\\sim 300$ eV), the radiation pressure is in the sub-Mbar to Mbar range, which is comparable to the thermal pressure of the evaporating gold wall.\n\n### Final Answer\n**Radiation Pressure** is the momentum flux of photons. It scales as $T^4$. In high-temperature environments like ICF hohlraums ($T \\\\\\\\approx 300$ eV), radiation pressure reaches the **Mbar range**, becoming a dominant force in the hydrodynamic expansion of the hohlraum walls and the compression of the capsule."}]} diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_eos.json b/MLExamples/zenith/SFT_HEDP_dataset/hedp_eos.json new file mode 100644 index 00000000..bde66922 --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_eos.json @@ -0,0 +1,34 @@ +[ + { + "conversations": [ + {"from": "human", "value": "Explain why the Ideal Gas Law fails at densities above $10^{23} \text{ cm}^{-3}$ in HEDP experiments and what model should replace it."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Identify the Regime**: At $n_e \sim 10^{23} \text{ cm}^{-3}$, the inter-particle spacing becomes comparable to the de Broglie wavelength of the electrons.\n2. **Physical Phenomenon**: Electrons are fermions and must obey the Pauli Exclusion Principle. This introduces 'Degeneracy Pressure' that is independent of temperature.\n3. **Comparison**: In an ideal gas, $P \propto T$. In a fully degenerate Fermi gas, $P \propto \rho^{5/3}$.\n4. **Selection of Model**: The **Thomas-Fermi (TF) model** is the standard replacement, as it treats electrons as a cold fluid in a potential well created by the nuclei.\n\n### Final Answer\nThe Ideal Gas Law fails because it neglects **quantum degeneracy**. At high densities, the Heisenberg uncertainty principle forces electrons into higher momentum states, creating a pressure even at zero temperature. For HEDP simulations, the **Thomas-Fermi model** (or more advanced DFT-based EOS) is used to account for this electronic pressure and the resulting material compressibility."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Derive the shock compression limit for an ideal monatomic gas ($\gamma = 5/3$) using the Rankine-Hugoniot relations."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Rankine-Hugoniot Density Ratio**: The ratio of post-shock density $\rho_2$ to initial density $\rho_1$ is given by:\n $$\frac{\rho_2}{\rho_1} = \frac{(\gamma+1)M^2}{(\gamma-1)M^2 + 2}$$\n2. **Strong Shock Limit**: For HEDP, the Mach number $M \to \infty$.\n3. **Simplify**: As $M^2$ becomes very large, the constant '2' in the denominator becomes negligible.\n $$\frac{\rho_2}{\rho_1} \to \frac{\gamma+1}{\gamma-1}$$\n4. **Substitute $\gamma$**: For $\gamma = 5/3$, the ratio is $(5/3 + 1) / (5/3 - 1) = (8/3) / (2/3) = 4$.\n\n### Final Answer\nIn the strong shock limit, an ideal monatomic gas can only be compressed to **4 times** its initial density. This is a fundamental constraint in ICF; to achieve the higher densities needed for ignition (e.g., $1000 \times$ solid density), physicists must use a sequence of carefully timed 'weak' shocks rather than a single strong one to stay on a lower adiabat."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the 'Hugoniot Elastic Limit' (HEL) and why is it relevant for planetary science in HEDP?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: The HEL is the maximum compressive stress a solid can withstand under one-dimensional shock loading before it transitions from purely elastic to plastic (permanent) deformation.\n2. **Planetary Context**: Deep planetary interiors (like Earth's core or 'Super-Earths') exist at pressures far exceeding the HEL of silicates and iron.\n3. **Experimental Link**: HEDP facilities use 'ramp compression' (non-shock) to keep materials below the HEL or to study the transition precisely without melting the sample.\n\n### Final Answer\nThe **Hugoniot Elastic Limit (HEL)** marks the point where a material's internal strength is overcome by shock pressure. It is critical for planetary science because it determines the state (solid vs. liquid) and structural phase of minerals in planetary mantles. Knowing the HEL allows researchers to interpret seismic data and build accurate models of planetary formation."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "A material has a SESAME EOS table entry. What three primary physical components are typically summed to create the total pressure $P_{total}(\rho, T)$ in such tables?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Component 1 (Cold Curve)**: The zero-temperature pressure $P_c(\rho)$ due to interatomic forces at $T=0$.\n2. **Component 2 (Ion Thermal)**: The pressure contribution from the motion of the nuclei (often treated with a Debye or Cowan model).\n3. **Component 3 (Electron Thermal)**: The pressure from the thermal excitation of electrons (often using Thomas-Fermi or similar models).\n4. **Totaling**: $P_{total} = P_{cold}(\rho) + P_{ion\_thermal}(\rho, T) + P_{elec\_thermal}(\rho, T)$.\n\n### Final Answer\nSESAME EOS tables typically sum the **Cold Curve** (elastic pressure), **Ion Thermal** pressure (lattice vibrations), and **Electron Thermal** pressure (excitation/ionization). This modular approach allows the tables to span from cold solid states to hot, fully ionized plasmas."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Define 'Ionization Potential Depression' (IPD) and its effect on the Equation of State in dense plasmas."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: In a dense plasma, the electric fields of neighboring ions and free electrons overlap with a bound electron's nucleus.\n2. **Effect**: This reduces the energy required to ionize an atom compared to an isolated atom in a vacuum.\n3. **Models**: The Stewart-Pyatt or Ecker-Kröll models are commonly used to calculate the shift $\Delta E$.\n4. **EOS Impact**: IPD increases the average ionization state $\langle Z \rangle$ for a given temperature, which directly increases the electronic pressure $P_e = n_e kT$.\n\n### Final Answer\n**Ionization Potential Depression (IPD)** is the lowering of ionization thresholds due to plasma environment effects. In the EOS, it results in 'pressure ionization,' where a material becomes a plasma purely due to high density even at low temperatures, significantly altering the material's compressibility and energy absorption."} + ] + } +] + + diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_icf_basics.json b/MLExamples/zenith/SFT_HEDP_dataset/hedp_icf_basics.json new file mode 100644 index 00000000..8f54372e --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_icf_basics.json @@ -0,0 +1,35 @@ + +[ + { + "conversations": [ + {"from": "human", "value": "Explain the difference between 'Direct Drive' and 'Indirect Drive' ICF. Which one currently holds the record for fusion gain?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Direct Drive**: Laser beams point directly at the fusion capsule. High energy efficiency but prone to laser-imprint instabilities.\n2. **Indirect Drive**: Lasers hit the inside of a high-Z cylinder (Hohlraum), converting laser light into a symmetric X-ray bath that compresses the capsule.\n3. **Comparison**: Indirect drive provides better symmetry but loses ~70-80% of energy during the X-ray conversion process.\n4. **Current Record**: The National Ignition Facility (NIF) uses Indirect Drive and achieved $Q > 1$ (Ignition) in 2022.\n\n### Final Answer\nIn **Direct Drive**, the laser energy is absorbed directly by the capsule. In **Indirect Drive**, the lasers create an X-ray 'oven' (Hohlraum) to compress the fuel. As of 2026, **Indirect Drive** holds the record for the highest fusion gain, having achieved scientific ignition at the NIF by producing more fusion energy than the laser energy delivered to the target."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the purpose of 'Pulse Shaping' (e.g., the picket and the main drive) in an ICF laser shot?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Goal**: Compress the fuel to high density without heating it too much early on (keeping it on a low adiabat).\n2. **The Picket**: A short, early pulse that sets the initial shock. It determines the 'adiabat' ($s$) of the fuel.\n3. **The Trough**: A period of lower power that allows the shock to travel through the ablator.\n4. **The Main Drive**: The final high-power ramp that provides the bulk of the compression.\n5. **Physics**: Proper timing prevents the shocks from coalescing too early, which would cause pre-heating and prevent high compression.\n\n### Final Answer\n**Pulse Shaping** is used to control the entropy (adiabat) of the fuel. By sending a series of timed shocks (the **picket** followed by the **main drive**), physicists can compress the DT fuel while keeping it relatively 'cold' and compressible. If the shocks coalesce at the wrong time, the fuel becomes too hot to reach the densities required for ignition."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Define 'Alpha Heating' and its role in the transition from a burning plasma to ignition."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Fusion Reaction**: $D + T \to {}^4He (3.5 \text{ MeV}) + n (14.1 \text{ MeV})$.\n2. **Alpha Capture**: The neutrons escape the plasma, but the Alpha particles (${}^4He$) are charged and can be stopped by the dense fuel.\n3. **Feedback Loop**: As the Alphas deposit their 3.5 MeV of energy, they heat the fuel further, increasing the fusion rate, which produces more Alphas.\n4. **Ignition Threshold**: Ignition occurs when the power deposited by Alpha heating exceeds all loss mechanisms (radiation, conduction, expansion).\n\n### Final Answer\n**Alpha Heating** is the self-heating mechanism of a fusion plasma where the kinetic energy of helium nuclei (alpha particles) is redeposited into the fuel. It is the 'engine' of ignition; once Alpha heating dominates the energy balance, the fusion process becomes self-sustaining, leading to a massive increase in energy yield."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Why is 'High Density Carbon' (HDC/Diamond) often preferred over Beryllium or CH as an ablator material?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Density**: HDC is much denser than plastic (CH).\n2. **Ablation Pressure**: Higher density leads to higher ablation pressure for a given X-ray drive.\n3. **Pulse Duration**: Because HDC is thinner (due to its density), the laser pulse can be shorter, reducing the time for instabilities like SRS or SBS to grow.\n4. **Trade-off**: HDC is polycrystalline, which can lead to non-uniform shock propagation if not carefully manufactured.\n\n### Final Answer\n**High Density Carbon (HDC)** is preferred because its high mass density allows for a thinner ablator and a shorter laser pulse. This reduces the window for **Laser-Plasma Interactions (LPI)** to degrade the shot and allows for a higher 'implosion velocity,' which is critical for reaching the temperatures needed for DT fusion."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain the 'Hohlraum Symmetry' problem. How do 'Cross-Beam Energy Transfer' (CBET) and 'Inner/Outer Beam Ratios' help solve it?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **The Issue**: To get a spherical implosion, the X-ray flux inside the hohlraum must be perfectly uniform. \n2. **Geometry**: Lasers are divided into 'inner' beams (hitting the waist) and 'outer' beams (hitting the ends).\n3. **CBET**: This is a non-linear process where laser beams crossing at the hohlraum entrance exchange energy.\n4. **Tuning**: By shifting the wavelength of the beams slightly ($\Delta \lambda$), physicists can use CBET to move energy from the outer beams to the inner beams during the shot.\n\n### Final Answer\n**Hohlraum Symmetry** ensures the capsule is squeezed into a sphere rather than a 'pancake' or 'sausage' shape. Since the laser spots move as the hohlraum wall expands, **Cross-Beam Energy Transfer (CBET)** is used as a 'knob' to dynamically redistribute laser power between the inner and outer beams, maintaining a symmetric X-ray drive throughout the pulse."} + ] + } +] + + diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro.json b/MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro.json new file mode 100644 index 00000000..2b62ae27 --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro.json @@ -0,0 +1,34 @@ + +[ + { + "conversations": [ + {"from": "human", "value": "Distinguish between 'Optically Thick' and 'Optically Thin' regimes in the context of an HEDP plasma. How does the treatment of the Radiation Transport Equation (RTE) change?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Define Optical Depth**: $\\tau = \\int \\kappa \\rho dx$. \n2. **Optically Thin ($\\tau \\ll 1$)**: Photons escape the plasma without significant interaction. The radiation field is decoupled from the local matter temperature. RTE is solved by simple integration along rays (loss term only).\n3. **Optically Thick ($\\tau \\gg 1$)**: Photons undergo many scattering/absorption events. The radiation field reaches local thermodynamic equilibrium (LTE) with the matter ($I_\\nu \\approx B_\\nu$).\n4. **Mathematical Shift**: In the thick limit, the RTE reduces to a diffusion equation (the Rosseland approximation), where radiation flux $F = -\\frac{c}{3\\kappa\\rho} \\nabla E_r$.\n\n### Final Answer\nIn the **Optically Thin** regime, radiation acts as a volumetric energy loss (cooling). In the **Optically Thick** regime, radiation acts as a diffusive heat source. HEDP simulations transition between these; for example, a hohlraum plasma is often optically thin to high-energy laser gold M-band X-rays but optically thick to the lower-energy thermal 'drive' X-rays."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is a 'Marshak Wave' and how does its propagation velocity compare to a standard hydrodynamic shock?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Definition**: A Marshak wave is a non-linear radiation diffusion wave that propagates into cold material.\n2. **Physics**: It occurs when radiation pressure or energy density dominates. The front moves as $x_f \\propto \\sqrt{t}$ (diffusive scaling).\n3. **Velocity Comparison**: Initially, at high temperatures, the Marshak wave is **supersonic**—it moves faster than the material's sound speed $c_s$, meaning the material is heated before it can move.\n4. **Evolution**: As the wave cools, it slows down. Eventually, the sound speed catches up, and the radiation front 'shocks up,' transitioning into a radiation-driven hydrodynamic shock.\n\n### Final Answer\nA **Marshak Wave** is a supersonic heat front driven by radiation diffusion. Unlike a standard shock wave, which involves a discrete jump in density and mass motion, a Marshak wave (in its early phase) heats the material in place without significantly displacing it. In ICF, this wave is what 'soaks' into the capsule ablator to start the implosion process."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain the significance of the 'Eddington Approximation' in radiation hydrodynamics codes."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Problem**: The radiation intensity $I$ depends on position, time, AND direction (anisotropy).\n2. **The Approximation**: Assume the radiation field is nearly isotropic. This allows us to relate the radiation pressure tensor $P_{ij}$ to the radiation energy density $E_r$.\n3. **Mathematical Form**: $P_{ij} = \\frac{1}{3} E_r \\delta_{ij}$.\n4. **Result**: This 'closes' the moment equations of the RTE, turning a complex integro-differential equation into a simpler set of fluid-like equations (the $P_1$ or $M_1$ models).\n\n### Final Answer\nThe **Eddington Approximation** allows us to treat radiation as a fluid with a specific pressure ($P = E/3$). It is essential for computational efficiency in HEDP codes, enabling the coupling of radiation energy to the momentum equation of the plasma without tracking every individual photon trajectory."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "In a radiation-dominated shock, explain the structure of the 'Radiative Precursor.'"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Shock Setup**: A very strong shock (Mach > 10) creates a massive temperature jump.\n2. **Radiation Leakage**: The hot post-shock plasma emits intense X-rays. Because the upstream material is not perfectly opaque, these photons travel ahead of the physical shock front.\n3. **Pre-heating**: These photons are absorbed by the upstream 'cold' material, raising its temperature before the shock actually arrives.\n4. **Profile**: This leads to a gradual temperature increase ahead of the density jump, known as the radiative precursor.\n\n### Final Answer\nA **Radiative Precursor** is a region of heated material ahead of a shock front caused by photons escaping from the hot post-shock region. In HEDP experiments (like laser-driven shocks in foams), this precursor can change the compressibility of the material, effectively 'softening' the shock transition."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is 'Radiation Pressure' and at what energy density does it become comparable to material pressure in a gold plasma at 300 eV?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Formula**: Radiation pressure $P_r = \\frac{a T^4}{3}$, where $a \\approx 7.56 \\times 10^{-15} \\text{ erg/cm}^3\\text{K}^4$.\n2. **Conversion**: $300 \\text{ eV} \\approx 3.48 \\times 10^6 \\text{ K}$.\n3. **Calculation**: $P_r = \\frac{1}{3} (7.56 \\times 10^{-15}) (3.48 \\times 10^6)^4 \\approx 3.7 \times 10^{11} \\text{ dynes/cm}^2 \\approx 0.37 \\text{ Mbar}$.\n4. **Comparison**: In a typical NIF hohlraum ($T \\sim 300$ eV), the radiation pressure is in the sub-Mbar to Mbar range, which is comparable to the thermal pressure of the evaporating gold wall.\n\n### Final Answer\n**Radiation Pressure** is the momentum flux of photons. It scales as $T^4$. In high-temperature environments like ICF hohlraums ($T \\approx 300$ eV), radiation pressure reaches the **Mbar range**, becoming a dominant force in the hydrodynamic expansion of the hohlraum walls and the compression of the capsule."} + ] + } +] + diff --git a/MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro_simulation.json b/MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro_simulation.json new file mode 100644 index 00000000..e7642571 --- /dev/null +++ b/MLExamples/zenith/SFT_HEDP_dataset/hedp_radhydro_simulation.json @@ -0,0 +1,155 @@ + +[ + { + "conversations": [ + {"from": "human", "value": "When discretizing the radiation diffusion equation, why is an Implicit scheme (like Backward Euler) preferred over an Explicit scheme?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Stability Analysis**: The radiation diffusion equation is parabolic. Explicit schemes are governed by the CFL (Courant-Friedrichs-Lewy) condition.\n2. **Constraint**: For radiation, the timestep $\Delta t$ would scale as $\Delta x^2 / D$. Since the diffusion coefficient $D$ (related to the speed of light) is massive, the maximum stable $\Delta t$ would be infinitesimally small.\n3. **Implicit Advantage**: Implicit schemes are unconditionally stable, allowing for timesteps based on hydrodynamic motion rather than the speed of radiation transport.\n\n### Final Answer\nImplicit schemes are preferred because the **CFL limit for explicit radiation diffusion** is computationally prohibitive. Using an implicit solver allows the simulation to take much larger timesteps, effectively decoupling the fast radiation transport from the slower hydrodynamic evolution of the plasma."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain the 'Flux Limiter' (e.g., Levermore-Pomraning) in the context of the diffusion approximation."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Diffusion Limit Failure**: In optically thin regions, the standard diffusion equation predicts infinite signal propagation speed ($F = -D \nabla E$).\n2. **Physical Limit**: Realistically, the radiation flux $F$ cannot exceed $cE$ (the free-streaming limit).\n3. **The Fix**: A flux limiter $\lambda$ is introduced to modify the diffusion coefficient such that as the gradient becomes large (optically thin), $F$ asymptotically approaches $cE$.\n\n### Final Answer\nA **Flux Limiter** is a numerical 'patch' that prevents the diffusion approximation from predicting **supersonic radiation transport** in optically thin regions. It ensures that the calculated flux never exceeds the physical speed of light, which is critical for correctly modeling the Laser Entrance Hole (LEH) environment."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is 'Operator Splitting' in a Rad-Hydro code and what are the associated risks?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Concept**: Solving the hydrodynamics, heat conduction, and radiation transport in separate, sequential steps within a single timestep.\n2. **Implementation**: First update $\rho, u$ (Hydro), then update $T$ (Conduction), then update $E_r$ (Radiation).\n3. **Risk**: If the coupling between radiation and matter is strong (e.g., in a shock), splitting can introduce 'splitting errors' or numerical instabilities unless the steps are sub-cycled or iterated for consistency.\n\n### Final Answer\n**Operator Splitting** breaks down the complex coupled system into solvable sub-problems. The primary risk is **numerical decoupling**, where the matter and radiation energy exchange is lagged by one step, potentially leading to non-physical oscillations or 'energy leaks' in regions with high optical depth."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Describe the 'Sn' (Discrete Ordinates) method for solving the Radiation Transport Equation (RTE)."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Discretization**: Unlike diffusion (which uses energy density), $S_n$ discretizes the angular direction of radiation into $n$ specific 'ordinates' or rays.\n2. **Accuracy**: It provides a more accurate solution than diffusion in the 'translucent' regime ($\tau \approx 1$).\n3. **Cost**: Computational complexity scales with the number of angles, making $S_8$ or $S_{16}$ significantly more expensive than a simple diffusion solver.\n\n### Final Answer\nThe **$S_n$ Discrete Ordinates method** solves the RTE by tracking radiation along a finite set of discrete angles. It is superior to diffusion for modeling **anisotropic radiation fields**, such as the direct 'line-of-sight' heating from laser spots on a hohlraum wall."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "In Lagrangian hydrodynamics, what is 'Mesh Tangling' and why is it common in ICF implosion simulations?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Lagrangian Definition**: The computational grid moves with the fluid mass.\n2. **Convergent Flow**: In ICF, the capsule shrinks by a factor of 30. As zones compress, their aspect ratios become extreme.\n3. **Tangling**: High-shear areas or Rayleigh-Taylor 'fingers' can cause grid vertices to cross over each other, creating negative volumes.\n4. **Solution**: Use ALE (Arbitrary Lagrangian-Eulerian) methods to occasionally 'relax' or remap the mesh.\n\n### Final Answer\n**Mesh Tangling** occurs when the moving grid cells become highly distorted or inverted. It is frequent in ICF due to the **extreme convergence and hydrodynamic instabilities**; if the grid isn't periodically re-aligned (using ALE), the simulation will crash due to mathematical singularities in the zone volume calculations."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain 'Artificial Viscosity' (e.g., von Neumann-Richtmyer) and its necessity in shock capturing."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Shock Discontinuity**: Shocks are mathematically zero-width jumps. Digital grids cannot represent a true discontinuity.\n2. **Oscillations**: Without a fix, shocks cause 'Gibbs phenomenon' (ringing/oscillations) behind the front.\n3. **Mechanism**: Artificial viscosity adds a dissipative term that 'smears' the shock over 2-3 zones, allowing the code to resolve the jump pressure stably.\n\n### Final Answer\n**Artificial Viscosity** is a numerical term added to the momentum and energy equations to **stabilize shock fronts**. It converts kinetic energy into internal energy across a few grid cells, preventing non-physical oscillations and ensuring the simulation obeys the Rankine-Hugoniot jump conditions."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is 'Multi-Group Diffusion' and how does it differ from 'Grey Diffusion'?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Grey Diffusion**: Assumes all radiation shares a single average opacity and temperature (one energy bin).\n2. **Multi-Group**: Divides the X-ray spectrum into discrete frequency bins (groups), each with its own opacity $\kappa_\nu$.\n3. **Physics**: Necessary for ICF because high-energy 'hard' X-rays (M-band) have much lower opacity than 'soft' thermal X-rays.\n\n### Final Answer\n**Multi-Group Diffusion** tracks radiation across multiple energy bins rather than a single 'Grey' average. This is critical for ICF to correctly model **pre-heat**, as it allows the code to distinguish between the soft X-rays driving the ablation and the hard X-rays that penetrate deep into the fuel."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Define 'Z-layering' (or material zoning) in an ICF target simulation."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Multi-material Setup**: ICF targets have distinct layers (Be/HDC ablator, DT ice, DT gas).\n2. **Interface Tracking**: The code must handle zones containing two different materials ('mixed zones').\n3. **EOS Coupling**: Each material must be linked to its specific SESAME or lookup table to ensure the correct pressure response.\n\n### Final Answer\n**Z-layering** refers to the initialization of different material properties across the mesh. Accurate zoning is essential for capturing the **refraction and reflection of shocks** at material interfaces, such as the transition from the plastic ablator to the cryogenic DT fuel."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the 'Courant Condition' (CFL) for a 1D hydrodynamics code?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Physical Limit**: Information (sound waves) cannot travel further than one grid cell ($\Delta x$) in a single timestep ($\Delta t$).\n2. **Formula**: $\Delta t \leq C \cdot \frac{\Delta x}{u + c_s}$, where $C$ is the Courant number ($<1$).\n3. **Constraint**: If violated, the code becomes unstable as it tries to 'skip' the physical interactions happening between cells.\n\n### Final Answer\nThe **CFL condition** limits the timestep $\Delta t$ based on the local sound speed and fluid velocity. In ICF simulations, the timestep often drops to **femtoseconds** during peak compression because the sound speed $c_s$ becomes extremely high as the plasma heats to millions of degrees."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Describe 'Ray Tracing' in the context of laser energy deposition in an ICF code."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Energy Source**: The laser is an external source of energy.\n2. **Propagation**: The code tracks 'rays' through the plasma mesh.\n3. **Absorption**: Energy is deposited via Inverse Bremsstrahlung as the ray passes through zones with specific electron densities $n_e$ and temperatures $T_e$.\n4. **Refraction**: Rays bend according to the gradient of the refractive index $\nabla \eta$.\n\n### Final Answer\n**Ray Tracing** is the algorithm used to simulate **laser propagation and absorption**. It tracks thousands of geometric rays through the plasma, calculating how much energy is absorbed in each cell and how the beam 'bends' due to density gradients in the hohlraum gas."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Why is 'Electron Thermal Conduction' often modeled using a flux-limited Spitzer-H\u00e4rm model?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Spitzer-H\u00e4rm**: Classical heat conduction $q = -\kappa \nabla T$, where $\kappa \propto T^{5/2}$.\n2. **The Problem**: In HEDP, temperature gradients are so steep that the model can predict heat flux higher than the 'electron thermal limit' (all electrons moving at the thermal speed).\n3. **The Fix**: A 'flux limiter' (typically $f=0.06$) is applied to cap the heat flow at a physical maximum.\n\n### Final Answer\nThe **Flux-limited Spitzer model** is used because classical conduction overestimates heat flow in the presence of steep HEDP gradients. A **limit factor (f-norm)** is applied to ensure the heat flux remains physically consistent with the maximum energy the electron population can actually carry."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain 'In-line Opacity' calculation vs. 'Table-Lookup' in Rad-Hydro codes."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Table-Lookup**: Pre-calculated opacities (e.g., TOPS) are stored in a file. The code interpolates $(\rho, T)$. Fast but less flexible.\n2. **In-line**: The code solves atomic physics (Saha/Boltzmann) every timestep to find the opacity. Slow but allows for non-LTE (Local Thermodynamic Equilibrium) effects.\n3. **Hybrid**: Modern codes often use tables for the bulk and in-line for specific tracer dopants.\n\n### Final Answer\n**Table-Lookup** provides computational speed by using pre-calculated data, while **In-line calculation** offers higher physical fidelity for non-equilibrium plasmas. Most ICF ignition simulations rely on high-quality tables to handle the complex gold M-band spectra efficiently."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the 'P1 Approximation' and how does it relate to the Eddington closure?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **RTE Expansion**: Expand radiation intensity $I$ in spherical harmonics.\n2. **Trunaction**: Keep only the first two terms ($\ell=0, 1$). This yields equations for energy density and flux.\n3. **Closure**: Requires a relationship between pressure and energy density ($P = fE$). The Eddington factor $f=1/3$ is the simplest closure.\n\n### Final Answer\nThe **$P_1$ Approximation** is a moment-based method for solving radiation transport. It assumes the radiation field is nearly isotropic, leading to a set of hyperbolic equations that are more accurate than simple diffusion in modeling the 'start-up' of radiation flow."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "In 3D ICF simulations, what is 'Hourglassing' and how is it controlled?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Numerical Error**: Occurs in staggered-mesh Lagrangian codes.\n2. **Pattern**: Cells distort into a 'bowtie' or 'hourglass' shape without any change in volume or internal energy, meaning the physics solver 'doesn't feel it.'\n3. **Control**: Artificial 'Hourglass Resistance' (stiffness or damping) is added to the nodes to penalize these non-physical distortions.\n\n### Final Answer\n**Hourglassing** is a non-physical mesh distortion that carries zero energy. It is controlled by adding **numerical damping forces** that resist the 'twisting' of cells, ensuring the grid remains representative of the physical plasma volume during high-compression implosions."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "How do codes handle 'Equations of State' (EOS) at the material interface between high-Z and low-Z materials?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Mixed Zones**: Zones containing multiple materials (e.g., Au and He).\n2. **Pressure Equilibrium**: Most codes assume all materials in a zone share the same pressure and temperature.\n3. **Mixing Rules**: The code calculates a weighted average of the internal energies or uses an 'Amagat's Law' volume-addition approach to determine the zone's total response.\n\n### Final Answer\nAt material interfaces, codes use **Mixed-Zone Models** to blend the EOS of different materials. The code typically enforces **pressure and temperature equilibrium** within the cell, using the mass-weighted properties of the constituents to determine the hydrodynamic response of the interface."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is 'Sub-cycling' in the context of radiation transport solvers?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Time Scales**: Radiation often evolves faster than hydrodynamics.\n2. **Technique**: For one 'Hydro' timestep, the code may run 10 or 100 'Radiation' timesteps.\n3. **Efficiency**: This allows the code to maintain stability in the radiation field without forcing the expensive hydro calculations (like mesh remapping) to happen at the same high frequency.\n\n### Final Answer\n**Sub-cycling** allows the radiation solver to take multiple small steps for every single hydrodynamic step. This **maximizes efficiency** by only applying the most rigorous time-constraints to the physics modules that require them, rather than slowing down the entire simulation code."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Define 'Conservative' vs. 'Non-Conservative' forms of the hydrodynamics equations in simulation codes."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Conservative**: Solves for $\rho, \rho u, E$ (Mass, Momentum, Total Energy). It naturally ensures that these quantities are perfectly conserved across the mesh.\n2. **Non-Conservative**: Solves for $u, T, P$. Easier to code but can 'lose' energy during shock propagation or mesh remapping.\n3. **Preference**: HEDP codes almost always use conservative forms to ensure the massive energy of the laser is correctly tracked.\n\n### Final Answer\n**Conservative forms** solve for the fundamental quantities like total energy and momentum directly. They are required for HEDP to ensure **perfect energy balance**; a non-conservative code might 'create' or 'destroy' energy at a shock front, leading to incorrect predictions of fusion yield."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is the 'Multi-material ALE' (Arbitrary Lagrangian-Eulerian) method?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Lagrange Step**: Mesh moves with the fluid (good for tracking interfaces).\n2. **Remesh Step**: If cells get too distorted, a new, cleaner mesh is created.\n3. **Remap Step**: The mass, momentum, and energy from the old mesh are 'mapped' onto the new mesh using advection algorithms.\n\n### Final Answer\n**Multi-material ALE** combines the benefits of tracking interfaces (Lagrangian) with the ability to handle large distortions (Eulerian). It is the 'gold standard' for ICF simulations, allowing the code to track the capsule layers accurately until the very high-convergence stagnation phase."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain the role of 'Atomic Kinetic' models (like DCA) in Rad-Hydro codes."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **LTE vs. non-LTE**: In low-density hohlraum plasma, the matter and radiation are not in equilibrium.\n2. **DCA (Detailed Configuration Accounting)**: Instead of a simple average $Z$, the code tracks the population of every electronic state of the gold ions.\n3. **Coupling**: This provides much more accurate X-ray emission and absorption rates for the hohlraum drive.\n\n### Final Answer\n**Atomic Kinetic models** like DCA track the detailed population of ionic states. They are essential for modeling **non-LTE hohlraum plasmas**, where the standard Saha equation fails to predict the correct X-ray spectrum produced by the laser-heated gold walls."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "How do simulations model 'Neutron Transport' differently from 'Radiation Transport'?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Radiation**: Highly coupled to matter; photons have a short mean-free path ($\tau \gg 1$). Uses diffusion.\n2. **Neutrons**: Long mean-free path; they rarely interact with the plasma except at the very highest densities ($\rho R > 0.3$).\n3. **Method**: Neutrons are usually tracked using Monte Carlo methods or very high-order $S_n$ transport because they 'stream' out of the hotspot.\n\n### Final Answer\n**Neutron Transport** is typically solved using **Monte Carlo or high-order $S_n$** because neutrons are almost entirely non-collisional (optically thin). Unlike radiation, which diffuses through the plasma, neutrons stream directly to the diagnostics, only losing energy in the dense 'cold fuel' shell."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Describe 'Parallel Scaling' challenges in 3D Rad-Hydro codes."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Domain Decomposition**: The 3D grid is split across thousands of CPUs.\n2. **Communication**: Hydrodynamics only needs to talk to 'neighbor' cells. Radiation diffusion is a 'global' problem; every cell can potentially affect every other cell.\n3. **Bottleneck**: The implicit matrix solver for radiation transport often becomes the bottleneck, requiring massive 'all-to-all' data transfers across the supercomputer.\n\n### Final Answer\n**Parallel Scaling** is limited by the **implicit radiation solver**. While hydrodynamic movements are local and scale well, the global nature of radiation diffusion requires intensive communication between all processors, often dictating the maximum number of cores a simulation can efficiently use."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is 'Energy Deposition' in a Monte Carlo radiation solver?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Stochastic Tracking**: Photons are launched as 'packets' (random walk).\n2. **Interaction**: When a packet is 'absorbed' in a cell, its energy is added to the cell's internal energy $e$.\n3. **Statistical Noise**: If too few packets are used, the energy deposition is 'patchy,' leading to non-physical temperature spikes.\n\n### Final Answer\nIn **Monte Carlo solvers**, energy deposition is the process of transferring energy from tracked photon packets to the fluid mesh. The primary challenge is **minimizing statistical noise**, as low packet counts can seed 'numerical' instabilities that look like physical turbulence but are actually artifacts of the random sampling."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Explain the significance of 'Double Precision' (64-bit) in HEDP codes."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Dynamic Range**: HEDP involves densities from $10^{-6}$ to $10^3$ g/cc and temperatures from $0.02$ to $10^4$ eV.\n2. **Accumulation**: In 100,000+ timesteps, small rounding errors in 32-bit floats would accumulate into massive energy imbalances.\n3. **Requirement**: Conservative laws cannot be maintained with 32-bit precision over the timescales of an ICF implosion.\n\n### Final Answer\n**Double Precision** is mandatory because of the **extreme dynamic range** of HEDP. Without 64-bit calculations, numerical 'drift' would violate the conservation of energy and mass, rendering the simulation results for fusion yield completely unreliable."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "What is 'Initial Condition (IC) Perturbation' in RTI simulations?"}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Seeding**: Instabilities need a 'seed' to grow. \n2. **Method**: Code developers manually add a small sine-wave or 'white noise' variation to the interface position or density.\n3. **Validation**: This allows the code to be compared against analytical growth rates ($\gamma = \sqrt{Akg}$) to ensure the hydro-solver is accurate.\n\n### Final Answer\n**IC Perturbations** are intentional, microscopic 'wrinkles' added to the capsule surface in a simulation. They are used to **seed instabilities** like Rayleigh-Taylor, allowing researchers to study how initial target defects will grow and eventually disrupt the fusion burn during stagnation."} + ] + }, + { + "conversations": [ + {"from": "human", "value": "Define 'Post-Processing' in the context of a 3D NIF simulation."}, + {"from": "gpt", "value": "### Reasoning Process\n1. **Raw Data**: The code outputs $\rho, T, u, Z$ in billions of cells.\n2. **Synthetic Diagnostics**: Separate codes (like SPECT3D) take this data and 'simulate' what a real-world camera or spectrometer would see.\n3. **Comparison**: This allows the 'synthetic' yield and X-ray images to be compared directly to the 'real' experimental data.\n\n### Final Answer\n**Post-Processing** involves running 'Synthetic Diagnostic' codes on the raw simulation data. This creates **simulated experimental outputs** (like X-ray images or neutron spectra), which are the only valid way to compare a complex 3D simulation to the actual data recorded during a shot at the NIF."} + ] + } +] + + diff --git a/MLExamples/zenith/VERSION b/MLExamples/zenith/VERSION new file mode 100644 index 00000000..45c7a584 --- /dev/null +++ b/MLExamples/zenith/VERSION @@ -0,0 +1 @@ +v0.0.1 diff --git a/MLExamples/zenith/create_aivenv.sh b/MLExamples/zenith/create_aivenv.sh new file mode 100755 index 00000000..7cb66b28 --- /dev/null +++ b/MLExamples/zenith/create_aivenv.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -e + +ROCMVERSION=7.2.1 +#module load amd/$ROCMVERSION +module load rocm/$ROCMVERSION +#module load python/3.13.2 + +python3 -m venv aivenv --system-site-packages +source aivenv/bin/activate + +python -m pip install --upgrade pip +python -m pip install -r requirements.txt + +python -m pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.4/ +python -m pip install --upgrade setuptools lit ipython wheel zstandard +python -m pip install --upgrade autogen +python -m pip install --upgrade bitsandbytes +python -m pip install --upgrade openai + +python -m pip install --upgrade transformers +python -m pip install --upgrade accelerate +python -m pip install --upgrade datasets +python -m pip install --upgrade evaluate +python -m pip install --upgrade numexpr +python -m pip install --upgrade pandas + +# fix certificates for local SSL +python -m pip uninstall --yes certifi +python -m pip install certifi --upgrade --no-cache-dir +python_cert_path=$(python -c "import certifi; print(certifi.where())") +cat /etc/ssl/certs/ca-bundle.crt >> $python_cert_path + diff --git a/MLExamples/zenith/dataset_validation.py b/MLExamples/zenith/dataset_validation.py new file mode 100644 index 00000000..04f931f8 --- /dev/null +++ b/MLExamples/zenith/dataset_validation.py @@ -0,0 +1,105 @@ + +import torch +import numpy as np +from transformers import AutoTokenizer +import os + +class SFTTokenizerWrapper: + def __init__(self, local_model_path, max_length=256): + print(f"Loading tokenizer from: {local_model_path}") + + if not os.path.exists(local_model_path): + raise FileNotFoundError(f"Local path not found: {local_model_path}") + + # load local model + self.tokenizer = AutoTokenizer.from_pretrained( + local_model_path, + trust_remote_code=True, + use_fast=True + ) + + if self.tokenizer.pad_token is None: + self.tokenizer.pad_token = self.tokenizer.eos_token + + self.max_length = max_length + self.inst_end_token = "[/INST]" + + def validate_batch(self, texts): + tokenized = self.tokenizer( + texts, + padding="max_length", + truncation=True, + max_length=self.max_length, + return_tensors="np" + ) + input_ids = tokenized["input_ids"] + labels = input_ids.copy() + + results = [] + + for i in range(len(texts)): + full_text = texts[i] + if self.inst_end_token in full_text: + parts = full_text.split(self.inst_end_token) + prompt_text = parts[0] + self.inst_end_token + + # encode prompt with BOS handling + prompt_token_ids = self.tokenizer.encode(prompt_text, add_special_tokens=True) + mask_limit = min(len(prompt_token_ids), self.max_length) + + # apply the -100 mask to labels + labels[i, :mask_limit] = -100 + + # mask padding + labels[i][input_ids[i] == self.tokenizer.pad_token_id] = -100 + + # extraction for report + unmasked_indices = np.where(labels[i] != -100)[0] + if len(unmasked_indices) > 0: + first_idx = unmasked_indices[0] + first_token_text = self.tokenizer.decode([input_ids[i][first_idx]]) + last_masked_token = self.tokenizer.decode([input_ids[i][first_idx - 1]]) if first_idx > 0 else "N/A" + else: + first_idx, first_token_text, last_masked_token = None, "NONE", "NONE" + + results.append({ + "prompt_sample": texts[i][:60], + "first_unmasked_idx": first_idx, + "last_masked_token": last_masked_token, + "first_unmasked_token": first_token_text + }) + + return results + + +if __name__ == "__main__": + + model = "/p/lustre5/belof1/hfmodels/Ministral-3-14B-Base-2512" + + test_data = [ + "[INST] What is the HBM capacity of an MI300A? [/INST] Each MI300A APU has 128GB of HBM3 memory.", + "[INST] Write a hello world in Python. [/INST] print('Hello, World!')", + ] + + try: + validator = SFTTokenizerWrapper(model) + outputs = validator.validate_batch(test_data) + + print("-" * 50) + print("MASKING VALIDATION REPORT") + print("-" * 50) + + for res in outputs: + print(f"Sample: {res['prompt_sample']}...") + print(f" Last Masked Token (Should be [/INST]): {res['last_masked_token']}") + print(f" First Learned Token (Should be Response): {res['first_unmasked_token']}") + print(f" Boundary Index: {res['first_unmasked_idx']}") + print("-" * 50) + + if "[/INST]" not in res['last_masked_token']: + print("WARNING: The boundary token was not detected correctly!") + + except Exception as e: + print(f"Error during validation: {e}") + + diff --git a/MLExamples/zenith/gpt-oss-20b-fft-hedp.yaml b/MLExamples/zenith/gpt-oss-20b-fft-hedp.yaml new file mode 100644 index 00000000..cc21ef6e --- /dev/null +++ b/MLExamples/zenith/gpt-oss-20b-fft-hedp.yaml @@ -0,0 +1,102 @@ +base_model: /app/models/gpt-oss-20b +#flash_attention: true +use_kernels: false +#model_kwargs: +# attn_implementation: "flash_attention_2" + +flash_attention: false +overrides_of_model_kwargs: + attn_implementation: "eager" # Switch from flash_attention_2 to sdpa + +model_quantization_config: Mxfp4Config +model_quantization_config_kwargs: + dequantize: true + +# XXX JB after finished with initial testing, run training with cutcrossentropy +#plugins: +# - axolotl.integrations.cut_cross_entropy.CutCrossEntropyPlugin + +# prevent oom by not putting model to GPU before sharding +experimental_skip_move_to_device: true + +datasets: + - path: /app/datasets/SFT_HEDP_dataset/hedp_dataset.jsonl + type: chat_template + chat_template: tokenizer_default + field_messages: conversations + message_property_mappings: + content: value + role: from + roles: + user: ["human"] + assistant: ["gpt"] + +val_set_size: 0 +output_dir: /app/models/gptoss-20b-hedp + +# XXX JB increase seq length after initial training +#sequence_len: 4096 +sequence_len: 512 +sample_packing: true +pad_to_sequence_len: true + +wandb_project: +wandb_entity: +wandb_watch: +wandb_name: +wandb_log_model: + +#pin_memory: true + +# XXX JB both of these should probably be written dynamically like the ray stuff, not hardcoded +dataset_num_proc: 8 +dataloader_num_workers: 4 +#dataset_num_proc: 4 +#dataloader_num_workers: 2 + +micro_batch_size: 4 +gradient_accumulation_steps: 4 +num_epochs: 100 +max_steps: 50 + + +optimizer: adamw_torch +lr_scheduler: constant_with_warmup +learning_rate: 2e-5 + +bf16: true +tf32: false + +activation_offloading: false + +logging_steps: 1 +saves_per_epoch: 1 + +warmup_ratio: 0.03 + +# gptoss to avoid the ID mismatch warning +model_config_overrides: + bos_token_id: 199998 + eos_token_id: 199999 + pad_token_id: 199999 + +deepspeed: /app/gpt-oss-20b-fft-hedp.zero3.json + +#fsdp_config: +# activation_checkpointing: true +# offload_params: false +# state_dict_type: SHARDED_STATE_DICT +# auto_wrap_policy: TRANSFORMER_BASED_WRAP +# transformer_layer_cls_to_wrap: GptOssDecoderLayer +# reshard_after_forward: true +# limit_all_gather_buffer: true +# sync_module_states: true +# use_orig_params: true + +save_safetensors: true +ray_log_to_driver: false + +##################################################################################### +# zenith autogenerated settings follow: data prep path, ray resource settings +##################################################################################### + diff --git a/MLExamples/zenith/gpt-oss-20b-fft-hedp.zero3.json b/MLExamples/zenith/gpt-oss-20b-fft-hedp.zero3.json new file mode 100644 index 00000000..d0157fed --- /dev/null +++ b/MLExamples/zenith/gpt-oss-20b-fft-hedp.zero3.json @@ -0,0 +1,29 @@ +{ + "bf16": { + "enabled": true + }, + "optimizer": { + "type": "AdamW", + "params": { + "torch_adam": true, + "adam_w_mode": true + } + }, + "zero_optimization": { + "stage": 3, + "overlap_comm": true, + "contiguous_gradients": true, + "sub_group_size": 5e7, + "reduce_bucket_size": "auto", + "stage3_prefetch_bucket_size": "auto", + "stage3_param_persistence_threshold": "auto", + "stage3_max_live_parameters": 1e8, + "stage3_max_reuse_distance": 1e8 + }, + "gradient_clipping": "auto", + "steps_per_print": 1, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "gradient_accumulation_steps": "auto", + "wall_clock_breakdown": false +} diff --git a/MLExamples/zenith/ministral-3-14B-cpt-science.preprocess.yaml b/MLExamples/zenith/ministral-3-14B-cpt-science.preprocess.yaml new file mode 100644 index 00000000..86fd8bb2 --- /dev/null +++ b/MLExamples/zenith/ministral-3-14B-cpt-science.preprocess.yaml @@ -0,0 +1,54 @@ +base_model: /app/models/Ministral-3-14B-Reasoning-2512 +flash_attention: true +use_kernels: false +model_kwargs: + attn_implementation: "flash_attention_2" + +# keep everything in VRAM, not a discrete GPU system +experimental_skip_move_to_device: true + +gradient_checkpointing: true +gradient_checkpointing_kwargs: + use_reentrant: false + +datasets: + - path: /app/datasets/sci-base-science-local + type: completion + text_column: text + +val_set_size: 0 +output_dir: /app/models/ministral-3-14b-cpt-science + +sequence_len: 2048 +pad_to_sequence_len: true +#sample_packing_bin_size: 2048 +sample_packing: false +eval_sample_packing: false +pretrain_multipack_attn: false + +# batch size math: 4 * 4 * 4 (GPUs) = 64 global batch +micro_batch_size: 4 +gradient_accumulation_steps: 4 +num_epochs: 3 +max_steps: 100 + +optimizer: adamw_torch +lr_scheduler: constant_with_warmup +learning_rate: 2e-5 + +bf16: true +tf32: false + +save_strategy: "epoch" +logging_steps: 1 +warmup_ratio: 0.03 + +save_safetensors: true +ray_log_to_driver: false + +streaming: false +streaming_multipack_buffer_size: 2000 +skip_prepare_dataset: false + +use_ray: false + diff --git a/MLExamples/zenith/ministral-3-14B-cpt-science.train.yaml b/MLExamples/zenith/ministral-3-14B-cpt-science.train.yaml new file mode 100644 index 00000000..6a7028dc --- /dev/null +++ b/MLExamples/zenith/ministral-3-14B-cpt-science.train.yaml @@ -0,0 +1,84 @@ +base_model: /app/models/Ministral-3-14B-Reasoning-2512 +flash_attention: true +use_kernels: false +model_kwargs: + attn_implementation: "flash_attention_2" + +# keep everything in VRAM, not a discrete GPU system +# XXX JB +#experimental_skip_move_to_device: true +experimental_skip_move_to_device: false + +gradient_checkpointing: true +gradient_checkpointing_kwargs: + use_reentrant: false + +# XXX JB don't bother with the validation loss calculation for now +#val_set_size: 2000 +val_set_size: 0 +output_dir: /app/models/ministral-3-14b-cpt-science + +sequence_len: 2048 +pad_to_sequence_len: true +#sample_packing_bin_size: 2048 +sample_packing: false +eval_sample_packing: false +pretrain_multipack_attn: false + +# batch size math: 4 * 4 * 4 (GPUs) = 64 global batch +micro_batch_size: 4 +gradient_accumulation_steps: 4 +num_epochs: 3 +max_steps: 100 + +optimizer: adamw_torch +lr_scheduler: constant_with_warmup +learning_rate: 2e-5 + +bf16: true +tf32: false + +save_strategy: "epoch" +logging_steps: 1 +warmup_ratio: 0.03 + +deepspeed: + bf16: + enabled: true + gradient_accumulation_steps: "auto" + gradient_clipping: "auto" + optimizer: + params: + adam_w_mode: true + torch_adam: true + type: AdamW + steps_per_print: 1 + train_batch_size: "auto" + train_micro_batch_size_per_gpu: "auto" + wall_clock_breakdown: false + zero_optimization: + contiguous_gradients: true + gather_16bit_weights_on_model_save: true + memory_efficient_linear: false + overlap_comm: false + reduce_bucket_size: 50000000 + stage: 3 + stage3_max_live_parameters: 1000000000 + stage3_max_reuse_distance: 1000000000 + stage3_param_persistence_threshold: 1000000 + stage3_prefetch_bucket_size: 50000000 + sub_group_size: 50000000 + +save_safetensors: true +ray_log_to_driver: false + +streaming: false +streaming_multipack_buffer_size: 2000 +skip_prepare_dataset: true + + +##################################################################################### +# zenith autogenerated settings follow: data prep path, ray resource settings +##################################################################################### + + diff --git a/MLExamples/zenith/ministral-3-14B-cpt-science.zero3.json b/MLExamples/zenith/ministral-3-14B-cpt-science.zero3.json new file mode 100644 index 00000000..0030c046 --- /dev/null +++ b/MLExamples/zenith/ministral-3-14B-cpt-science.zero3.json @@ -0,0 +1,33 @@ + +{ + "bf16": { + "enabled": true + }, + "optimizer": { + "type": "AdamW", + "params": { + "torch_adam": true, + "adam_w_mode": true + } + }, + "zero_optimization": { + "stage": 3, + "overlap_comm": false, + "memory_efficient_linear": false, + "contiguous_gradients": true, + "sub_group_size": 5e7, + "reduce_bucket_size": 5e7, + "stage3_prefetch_bucket_size": 5e7, + "stage3_param_persistence_threshold": 1e6, + "stage3_max_live_parameters": 1e9, + "stage3_max_reuse_distance": 1e9, + "gather_16bit_weights_on_model_save": true + }, + "gradient_clipping": "auto", + "steps_per_print": 1, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "gradient_accumulation_steps": "auto", + "wall_clock_breakdown": false +} + diff --git a/MLExamples/zenith/ministral-3-14B-fft-hedp.yaml b/MLExamples/zenith/ministral-3-14B-fft-hedp.yaml new file mode 100644 index 00000000..88b34fa3 --- /dev/null +++ b/MLExamples/zenith/ministral-3-14B-fft-hedp.yaml @@ -0,0 +1,63 @@ +base_model: /app/models/Ministral-3-14B-Reasoning-2512 +flash_attention: true +use_kernels: false +model_kwargs: + attn_implementation: "flash_attention_2" + +# prevent oom by not putting model to GPU before sharding +experimental_skip_move_to_device: true + +gradient_checkpointing: true +gradient_checkpointing_kwargs: + use_reentrant: false + +datasets: + - path: /app/datasets/SFT_HEDP_dataset/hedp_dataset.jsonl + type: chat_template + chat_template: tokenizer_default + field_messages: conversations + message_property_mappings: + content: value + role: from + roles: + user: ["human"] + assistant: ["gpt"] + +val_set_size: 0 +output_dir: /app/models/ministral-3-14b-hedp + +sequence_len: 2048 +sample_packing: true +pad_to_sequence_len: true + +dataset_num_proc: 128 +# XXX JB +#dataloader_num_workers: 2 +#dataloader_num_workers: 1 +dataloader_num_workers: 8 + +# batch size math: 4 * 4 * 4 (GPUs) = 64 global batch +# XXX JB +#micro_batch_size: 4 +micro_batch_size: 1 +gradient_accumulation_steps: 4 +num_epochs: 3 +max_steps: 100 + +optimizer: adamw_torch +lr_scheduler: constant_with_warmup +learning_rate: 2e-5 + +bf16: true +tf32: false + +logging_steps: 1 +saves_per_epoch: 1 +warmup_ratio: 0.03 + +deepspeed: /app/ministral-3-14B-fft-hedp.zero3.json + +save_safetensors: true +push_to_hub: false +ray_log_to_driver: false + diff --git a/MLExamples/zenith/ministral-3-14B-fft-hedp.zero3.json b/MLExamples/zenith/ministral-3-14B-fft-hedp.zero3.json new file mode 100644 index 00000000..7857c918 --- /dev/null +++ b/MLExamples/zenith/ministral-3-14B-fft-hedp.zero3.json @@ -0,0 +1,30 @@ +{ + "bf16": { + "enabled": true + }, + "optimizer": { + "type": "AdamW", + "params": { + "torch_adam": true, + "adam_w_mode": true + } + }, + "zero_optimization": { + "stage": 3, + "overlap_comm": true, + "contiguous_gradients": true, + "sub_group_size": 1e8, + "reduce_bucket_size": 5e8, + "stage3_prefetch_bucket_size": 5e8, + "stage3_param_persistence_threshold": 1e6, + "stage3_max_live_parameters": 1e9, + "stage3_max_reuse_distance": 1e9, + "gather_16bit_weights_on_model_save": true + }, + "gradient_clipping": "auto", + "steps_per_print": 1, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "gradient_accumulation_steps": "auto", + "wall_clock_breakdown": false +} diff --git a/MLExamples/zenith/mistral-small-4-119B-fft-hedp.yaml b/MLExamples/zenith/mistral-small-4-119B-fft-hedp.yaml new file mode 100644 index 00000000..b209b992 --- /dev/null +++ b/MLExamples/zenith/mistral-small-4-119B-fft-hedp.yaml @@ -0,0 +1,75 @@ +base_model: /app/models/Mistral-Small-4-119B-2603 +flash_attention: true +use_kernels: false +model_kwargs: + attn_implementation: "flash_attention_2" + +# prevent oom by not putting model to GPU before sharding +experimental_skip_move_to_device: true + +# gradient checkpointing is mandatory for 119B on 4-8 GPUs +gradient_checkpointing: true +gradient_checkpointing_kwargs: + use_reentrant: false + +datasets: + - path: /app/datasets/SFT_HEDP_dataset/hedp_dataset.jsonl + type: chat_template + chat_template: tokenizer_default + field_messages: conversations + message_property_mappings: + content: value + role: from + roles: + user: ["human"] + assistant: ["gpt"] + +val_set_size: 0 +output_dir: /app/models/mistral-small-4-119B-hedp + +# sequence length for MoE models impacts HBM significantly +sequence_len: 2048 +sample_packing: true +pad_to_sequence_len: true + +wandb_project: +wandb_entity: +wandb_watch: +wandb_name: +wandb_log_model: + +dataset_num_proc: 128 +dataloader_num_workers: 2 + +# total batch size = micro_batch (4) * grad_accum (4) * GPUs +# On 2 nodes (8 GPUs) = 128 +# On 4 nodes (16 GPUs) = 256 +micro_batch_size: 4 +gradient_accumulation_steps: 4 +num_epochs: 100 +max_steps: 50 + +optimizer: adamw_torch +lr_scheduler: constant_with_warmup +learning_rate: 2e-5 + +bf16: true +tf32: false + +activation_offloading: false + +logging_steps: 1 +saves_per_epoch: 1 + +warmup_ratio: 0.03 + +# deepSpeed ZeRO-3 is required for 119B +deepspeed: /app/mistral-small-4-119B-fft-hedp.zero3.json + +save_safetensors: true +ray_log_to_driver: false + +##################################################################################### +# zenith autogenerated settings follow: data prep path, ray resource settings +##################################################################################### + diff --git a/MLExamples/zenith/mistral-small-4-119B-fft-hedp.zero3.json b/MLExamples/zenith/mistral-small-4-119B-fft-hedp.zero3.json new file mode 100644 index 00000000..4419fe9c --- /dev/null +++ b/MLExamples/zenith/mistral-small-4-119B-fft-hedp.zero3.json @@ -0,0 +1,32 @@ + +{ + "bf16": { + "enabled": true + }, + "optimizer": { + "type": "AdamW", + "params": { + "torch_adam": true, + "adam_w_mode": true + } + }, + "zero_optimization": { + "stage": 3, + "overlap_comm": true, + "contiguous_gradients": true, + "sub_group_size": 1e8, + "reduce_bucket_size": 5e8, + "stage3_prefetch_bucket_size": 5e8, + "stage3_param_persistence_threshold": 1e6, + "stage3_max_live_parameters": 1e9, + "stage3_max_reuse_distance": 1e9, + "gather_16bit_weights_on_model_save": true + }, + "gradient_clipping": "auto", + "steps_per_print": 1, + "train_batch_size": "auto", + "train_micro_batch_size_per_gpu": "auto", + "gradient_accumulation_steps": "auto", + "wall_clock_breakdown": false +} + diff --git a/MLExamples/zenith/process_scibase.py b/MLExamples/zenith/process_scibase.py new file mode 100644 index 00000000..1a25a4ad --- /dev/null +++ b/MLExamples/zenith/process_scibase.py @@ -0,0 +1,116 @@ +""" +================================================================================ +SCIENCE FOUNDATION DATA EXTRACTOR: PHYSICS, CHEMISTRY, & LIFE SCIENCES +================================================================================ +DATASETS TARGETED: +- [opendatalab/Sci-Base](https://huggingface.co/datasets/opendatalab/Sci-Base) (Configurations: 'paper', 'textbook') + +This dataset was released on huggingface on March 27, 2026 +As Mistral Small 4 (119B-parameter Mixture-of-Experts model) was released on March 16, 2026 +and Ministral 3 14B was released on December 2, 2025, this is a good pretraining dataset +to test their knowledge accretion. + +OVERVIEW: +This script extracts a ~1B token "Science Foundation" corpus. By targeting +Physics, Chemistry, and Life Sciences, we capture the cross-disciplinary +data necessary for advanced scientific reasoning and simulation-agent tasks. + +HOW IT WORKS: +1. STREAMING: Uses 'datasets' streaming to process the 3.9TB repository shard + by shard without requiring massive local storage. +2. DISCIPLINE FILTERING: Inspects 'sci_category'. We specifically include + 'life sciences' alongside 'physics' and 'chemistry' to capture the + broadest range of hard-science data. +3. TEXT RECONSTRUCTION: Flattens the MinerU-parsed 'content_list' into clean + text strings, strictly filtering out null/None values. +4. LUSTRE OPTIMIZATION: Saves data in Parquet shards to ensure high-speed + I/O and parallel loading for Axolotl during training. + +DEPENDENCIES: +- pip install datasets pandas pyarrow tqdm huggingface_hub +================================================================================ +""" + +import os +import pandas as pd +from datasets import load_dataset +from tqdm import tqdm + +# Configuration +SAVE_DIR = "./sci-base-science-local" +TARGET_CATEGORIES = ["physics", "chemistry", "life sciences"] +CONFIGS = ['paper', 'textbook'] +# XXX JB optimize value for contiguous training data of larger size more suited to lustre performance +#SHARD_SIZE = 2500 +SHARD_SIZE = 20000 + +os.makedirs(SAVE_DIR, exist_ok=True) + +def extract_text(content_list): + """Flattens content_list, strictly ignoring NoneTypes and non-strings.""" + if not content_list or not isinstance(content_list, list): + return "" + + texts = [] + for item in content_list: + if isinstance(item, dict): + val = item.get('text') + if isinstance(val, str) and val.strip(): + texts.append(val) + + return "\n".join(texts) + +def stream_and_filter(): + buffer = [] + total_saved = 0 + shard_count = 0 + + for config in CONFIGS: + print(f"\n--- Starting Stream: opendatalab/Sci-Base [{config}] ---") + + # Load the stream from Hugging Face + ds = load_dataset('opendatalab/Sci-Base', config, streaming=True, split='train') + ds_iter = iter(ds) + + while True: + try: + entry = next(ds_iter) + except StopIteration: + break + except Exception: + continue + + # Filtering logic + category = str(entry.get('sci_category', '')).lower() + + if any(target in category for target in TARGET_CATEGORIES): + raw_text = extract_text(entry.get("content_list", [])) + + if raw_text.strip(): + buffer.append({ + "title": entry.get("title", ""), + "category": category, + "text": raw_text + }) + + # Save shard to Lustre + if len(buffer) >= SHARD_SIZE: + shard_path = os.path.join(SAVE_DIR, f"science_shard_{shard_count}.parquet") + pd.DataFrame(buffer).to_parquet(shard_path, engine='pyarrow', index=False) + + total_saved += len(buffer) + shard_count += 1 + buffer = [] + print(f"| Shards: {shard_count} | Total Rows: {total_saved} | Domain: {category}", end="\r") + + # Final flush + if buffer: + shard_path = os.path.join(SAVE_DIR, f"science_shard_{shard_count}.parquet") + pd.DataFrame(buffer).to_parquet(shard_path, engine='pyarrow', index=False) + total_saved += len(buffer) + + print(f"\n\nSuccess! Science Foundation (1B Token Goal) saved to: {SAVE_DIR}") + +if __name__ == "__main__": + stream_and_filter() + diff --git a/MLExamples/zenith/ray_health_fa2.py b/MLExamples/zenith/ray_health_fa2.py new file mode 100644 index 00000000..ff8d804e --- /dev/null +++ b/MLExamples/zenith/ray_health_fa2.py @@ -0,0 +1,55 @@ +# ensure that FA2 is working + +import torch, sys +import os + +def run_unique_fa2_smoke_test(): + print('--- EXECUTING FA2 SMOKE TEST ---') + try: + import flash_attn + from flash_attn import flash_attn_func + + # 1. HARD VERSION CHECK + # FA3 and FA4 will report versions >= 3.0.0 or 4.0.0 + version = flash_attn.__version__ + if not version.startswith('2.'): + print(f'FAIL: Version mismatch. Found FA {version}, expected 2.x') + return False + + # 2. NAMESPACE VERIFICATION + # Ensures we aren't using a 'kernels-community' wrapper + origin = flash_attn.__file__ + if 'kernels' in origin or 'vllm' in origin: + print(f'FAIL: Detected aliased/wrapped FA implementation at {origin}') + return False + + # 3. EXECUTION TEST + # We use a specific head dimension (128) and causal masking + # which triggers the standard FA2 ROCm GEMM kernels. + q = torch.randn((1, 128, 8, 128), dtype=torch.bfloat16, device='cuda') + k = torch.randn((1, 128, 8, 128), dtype=torch.bfloat16, device='cuda') + v = torch.randn((1, 128, 8, 128), dtype=torch.bfloat16, device='cuda') + + # We add 'window_size', which is handled via specific tiling in FA2 + # but often triggers different logic or errors in early FA3/FA4 previews + out = flash_attn_func(q, k, v, causal=True, window_size=(-1, -1)) + + # 4. ARCHITECTURE COMPATIBILITY CHECK + # FA2 ROCm specifically targets gfx90a/gfx942 for these dtypes. + # If this doesn't throw a 'Not implemented' error, the FA2-specific + # HSA/HIP binary is correctly mapped. + + print(f'FA2 KERNEL SUCCESSFUL (Version: {version}, Path: {origin})') + return True + + except AttributeError: + print('FAIL: flash_attn_func not found. This may be an incompatible FA3/FA4 structure.') + return False + except Exception as e: + print(f'FA2 CRITICAL KERNEL FAILURE: {e}') + return False + +if __name__ == '__main__': + sys.exit(0 if run_unique_fa2_smoke_test() else 1) + + diff --git a/MLExamples/zenith/ray_health_overall.py b/MLExamples/zenith/ray_health_overall.py new file mode 100644 index 00000000..03fd389d --- /dev/null +++ b/MLExamples/zenith/ray_health_overall.py @@ -0,0 +1,51 @@ +import sys +import torch +import torch.nn as nn +import ray +from ray.train.torch import TorchTrainer +from ray.train import ScalingConfig +import socket + +def health_check_func(config): + model = nn.Linear(10, 10).cuda() + model = ray.train.torch.prepare_model(model) + + input_data = torch.randn(32, 10).cuda() + loss = model(input_data).sum() + loss.backward() + + ray.train.report({ + "node": socket.gethostname(), + "gpu": torch.cuda.get_device_name(0), + "status": "SUCCESS" + }) + +def main(): + if len(sys.argv) < 4: + print("Usage: python ray_health_overall.py ") + sys.exit(1) + + nnodes = int(sys.argv[1]) + cpus_per_node = int(sys.argv[2]) + gpus_per_node = int(sys.argv[3]) + + total_workers = nnodes * gpus_per_node + cpus_per_worker = cpus_per_node // gpus_per_node + + ray.init(address="auto") + + trainer = TorchTrainer( + train_loop_per_worker=health_check_func, + scaling_config=ScalingConfig( + num_workers=total_workers, + use_gpu=True, + resources_per_worker={"CPU": cpus_per_worker, "GPU": 1} + ) + ) + + print(f"Verifying {total_workers} workers on {nnodes} nodes...") + result = trainer.fit() + print("RCCL Cluster Health Verified.") + +if __name__ == "__main__": + main() diff --git a/MLExamples/zenith/ray_health_rccl.py b/MLExamples/zenith/ray_health_rccl.py new file mode 100644 index 00000000..b8d550bb --- /dev/null +++ b/MLExamples/zenith/ray_health_rccl.py @@ -0,0 +1,71 @@ +import os +import sys +import torch +import torch.distributed as dist +import ray +from ray.train.torch import TorchTrainer +from ray.train import ScalingConfig, RunConfig + +def rccl_bandwidth_test_func(config): + size_mb = config.get("size_mb", 1024) + iterations = config.get("iterations", 10) + world_size = dist.get_world_size() + + n_elements = (size_mb * 1024 * 1024) // 4 + tensor = torch.ones(n_elements, device="cuda") + + dist.barrier() + start_event = torch.cuda.Event(enable_timing=True) + end_event = torch.cuda.Event(enable_timing=True) + + start_event.record() + for _ in range(iterations): + dist.all_reduce(tensor, op=dist.ReduceOp.SUM) + end_event.record() + + torch.cuda.synchronize() + total_time_ms = start_event.elapsed_time(end_event) + avg_time_s = (total_time_ms / 1000.0) / iterations + + size_bytes = size_mb * 1024 * 1024 + bus_bandwidth_gbps = (size_bytes * 2 * (world_size - 1) / world_size) / avg_time_s * 8 / 1e9 + + ray.train.report({"gbps": round(bus_bandwidth_gbps, 2), "status": "READY"}) + +def main(): + if len(sys.argv) < 4: + print("Usage: python ray_health_rccl.py ") + sys.exit(1) + + nnodes = int(sys.argv[1]) + cpus_per_node = int(sys.argv[2]) + gpus_per_node = int(sys.argv[3]) + + total_workers = nnodes * gpus_per_node + cpus_per_worker = cpus_per_node // gpus_per_node + + ray.init(address="auto", ignore_reinit_error=True) + + trainer = TorchTrainer( + train_loop_per_worker=rccl_bandwidth_test_func, + train_loop_config={"size_mb": 1024, "iterations": 10}, + scaling_config=ScalingConfig( + num_workers=total_workers, + use_gpu=True, + resources_per_worker={"CPU": cpus_per_worker, "GPU": 1} + ) + ) + + print(f"Testing {total_workers} workers across {nnodes} nodes...") + if nnodes > 1: + print(f"Running multinode, slingshot fabric bandwidth should be around 400 gbps") + else: + print(f"Running single node, infinity fabric bandwidth should be around 1600 gbps") + result = trainer.fit() + if result and result.metrics: + print(f"RCCL Final Bandwidth: {result.metrics.get('gbps', 'N/A')} Gbps") + else: + print("RCCL health check completed, but summary metrics were not captured.") + +if __name__ == "__main__": + main() diff --git a/MLExamples/zenith/requirements.txt b/MLExamples/zenith/requirements.txt new file mode 100644 index 00000000..9808be48 --- /dev/null +++ b/MLExamples/zenith/requirements.txt @@ -0,0 +1,117 @@ + +ray==2.54.0 +ray[train]==2.54.0 + +# dependencies needed for axolotl +# we specify these without versions or with minimums to avoid +# conflicting with the pre-installed optimized versions + +# --- debugging --- +py-spy==0.4.2 + +# --- core frameworks --- +#deepspeed==0.17.1 +deepspeed +accelerate==1.13.0 +transformers==5.5.0 +peft==0.18.1 + +# --- data Processing & tokenization --- +datasets==4.8.4 +tokenizers==0.22.2 +sentencepiece==0.2.1 +pyarrow==23.0.1 + +# --- axolotl CLI & telemetry --- +colorama==0.4.6 +distro==1.9.0 +posthog==7.9.12 +hf_transfer==0.1.9 +lion-pytorch==0.2.4 +#huggingface_hub==1.9.0 +huggingface_hub>=1.10.0 + +# --- supporting utilities --- +addict==2.4.0 +fastcore==1.12.34 +click==8.3.2 +python-dotenv==1.2.2 +requests==2.33.1 +pydantic==2.12.5 +fsspec==2026.2.0 +fire==0.7.1 +pyyaml==6.0.3 +psutil==7.2.2 +tqdm==4.67.3 +numba==0.65.0 +numba-hip==0.0.2 + +# --- scientific & GPU stack --- +scipy==1.17.1 +#pandas<3.0.0 +pandas==3.0.3 +scikit-learn==1.8.0 +pynvml==13.0.1 +einops==0.8.2 + +# --- metrics & logging --- +nltk==3.9.4 +rouge_score==0.1.2 +tensorboard==2.20.0 +tensorboardX==2.6.5 + +#mamba-ssm==1.2.0.post1 +#xformers>=0.0.23.post1 +liger-kernel==0.7.0 +packaging==26.2 +kernels==0.12.2 + +trl==0.29.0 +hf_xet==1.4.3 + +fla-core==0.4.1 +flash-linear-attention==0.4.1 + +trackio>=0.16.1 +typing-extensions>=4.15.0 + +optimum==1.16.2 +gradio>=6.10.0,<7.0 + +modal==1.3.0.post1 +PyYAML>=6.0 +requests==2.33.1 +wandb==0.25.1 +#numpy==2.4.6 +numpy>=2.2.6,<2.4 + +evaluate==0.4.1 +art==6.5 + +s3fs>=2024.5.0 +gcsfs>=2025.3.0 +adlfs>=2024.5.0 +ocifs==1.3.2 + +#zstandard==0.22.0 + +setuptools==82.0.1 +pillow==12.2.0 + +# lm eval harness +lm_eval==0.4.7 +langdetect==1.0.9 +immutabledict==4.2.0 +antlr4-python3-runtime==4.13.2 + +openenv-core==0.1.0 +schedulefree==1.4.1 + +axolotl-contribs-lgpl==0.0.7 +axolotl-contribs-mit==0.0.6 + +#mistral-common==1.10.0 +mistral-common==1.11.2 + + + diff --git a/MLExamples/zenith/run_container.sh b/MLExamples/zenith/run_container.sh new file mode 100755 index 00000000..7da8a4de --- /dev/null +++ b/MLExamples/zenith/run_container.sh @@ -0,0 +1,156 @@ +#!/bin/bash +# +# starts up ray within a container, spanning large multinode training run +# ray communicates across the virtual cluster over ethernet, +# RCCL communicates over the slingshot high speed fabric +# + +# arg checking +if [ $# != 5 ]; then + echo "Usage: $0 --head|--worker " + exit 1 +fi + +# host addr, node type and directory holding our LLMs +HEAD_NODE_ADDRESS="$1" # IP of the machine designated as the head (do NOT list worker machine IPs here) +NODE_TYPE="$2" # should be --head or --worker +MODELPATH="$3" # directory holding the model weights +DATASETSPATH="$4" # directory holding the datasets for training +MULTISTATE="$5" # whether numnodes=1 or >1 + +# arg checking on node type +if [ "${NODE_TYPE}" != "--head" ] && [ "${NODE_TYPE}" != "--worker" ]; then + echo "Error: Node type must be --head or --worker" + exit 1 +fi + +# arg checking on model path +if [ ! -d "${MODELPATH}" ]; then + echo "Error: Model path directory ${MODELPATH} does not exist" + exit 1 +fi + +# arg checking on datasets path +if [ ! -d "${DATASETSPATH}" ]; then + echo "Error: Datasets path directory ${DATASETSPATH} does not exist" + exit 1 +fi + +# whether it's a single or multinode run +if [ "${MULTISTATE}" != "single" ] && [ "${MULTISTATE}" != "multi" ]; then + echo "Error: multistate must be either single or multi" + exit 1 +fi + + +# kill off any partial container that might be left behind from a failed prior process +podman rm -af +buildah rm -a +podman rm -af +sleep 30 + +# define a function to cleanup on EXIT signal +cleanup() { + podman stop node || true + podman rm --force node || true +} +trap cleanup EXIT + +# get the IP address of the HPE slingshot device +MY_HSI_ADDRESS=`ifconfig hsi0 | grep inet | awk '{print $2}'` +# IP address of the ethernet device (use for ray comms) +MY_ETH_ADDRESS=`ifconfig enp129s0 | grep inet | awk '{print $2}'` + + +# command setup for head or worker node +SYS_CONFIG='{"state_api_timeout_s":60,"num_heartbeats_timeout":600,"health_check_timeout_ms":60000}' +RAY_START_CMD="ray start --block --disable-usage-stats --log-style=pretty --object-store-memory 10000000000" +if [ "${NODE_TYPE}" == "--head" ]; then + if [ "${MULTISTATE}" == "single" ]; then + # if it's a single node run, allow all gpus to be used on head (beware ray head memory usage though) + RAY_START_CMD+=" --head --node-ip-address=${MY_ETH_ADDRESS} --port=6379" + else + # allow only a single training instance to run on the head node to answer API requests + #RAY_START_CMD+=" --head --node-ip-address=${MY_HSI_ADDRESS} --port=6379 --num-cpus=0 --num-gpus=1" + # as of ray v2.44.0, the mem usage on the head node is no longer excessive: allow 4 workers to run there + RAY_START_CMD+=" --head --node-ip-address=${MY_ETH_ADDRESS} --port=6379" + fi +else + RAY_START_CMD+=" --address=${HEAD_NODE_ADDRESS}:6379 --node-ip-address=${MY_ETH_ADDRESS}" +fi + +# local node host name +MYHOSTNAME=`hostname` + +# copy the container image on the rabbit local storage node +IMAGE=train_image.tar +RABBIT_DIR=/l/ssd +RABBIT_IMAGE=${RABBIT_DIR}/${IMAGE} +#echo "transferring container image ${IMAGE} to the rabbit local storage device on ${MYHOSTNAME} ..." +#flux run -n 96 dcp ${IMAGE} ${RABBIT_DIR} +#echo "...completed" + +# clear out any old containers to avoid rootless uid mapping problems +podman system prune --force +sleep 30 + +# start up ray within the container +echo "starting up container on ${MYHOSTNAME} with ray command line ${RAY_START_CMD}" +podman run \ + -it \ + --log-level=error \ + --name=node \ + --network=host \ + --group-add=video \ + --ipc=host \ + --cap-add=SYS_PTRACE \ + --security-opt seccomp=unconfined \ + --device /dev/kfd \ + --device /dev/dri \ + --device /dev/cxi0 \ + --device /dev/cxi1 \ + --device /dev/cxi2 \ + --device /dev/cxi3 \ + --device /dev/cxi_sbl \ + --privileged \ + --env RAY_system_config="$SYS_CONFIG" \ + --env RAY_ADDRESS_HOST=${MY_ETH_ADDRESS} \ + --env RAY_EXPERIMENTAL_NOSET_HIP_VISIBLE_DEVICES=1 \ + --env RAY_EXPERIMENTAL_NOSET_ROCR_VISIBLE_DEVICES=1 \ + --env RAY_EXPERIMENTAL_NO_SET_CUDA_VISIBLE_DEVICES=1 \ + --env NCCL_DMABUF_ENABLE=0 \ + --env TORCH_NCCL_BLOCKING_WAIT=0 \ + --env TORCH_NCCL_ASYNC_ERROR_HANDLING=0 \ + --env TORCH_NCCL_ENABLE_MONITORING=0 \ + --env TRITON_CACHE_DIR=/tmp/.triton_cache \ + --env TORCH_EXTENSIONS_DIR=/tmp/.torch_extensions \ + --env HF_HOME=/tmp/.cache/huggingface \ + --env HIP_VISIBLE_DEVICES=0,1,2,3 \ + --env ROCR_VISIBLE_DEVICES=0,1,2,3 \ + --env CUDA_VISIBLE_DEVICES=0,1,2,3 \ + --env OMP_NUM_THREADS=1 \ + --env MKL_NUM_THREADS=1 \ + --env HIPBLASLT_DISABLE=1 \ + --env TORCH_BLAS_PREFER_HIPBLASLT=0 \ + --env NCCL_NET_GDR_LEVEL=0 \ + --env PYTORCH_TUNABLEOP_ENABLED=0 \ + --env LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 \ + --env NCCL_P2P_DISABLE=1 \ + --env HSA_XNACK=0 \ + --env ROCBLAS_USE_HIPBLASLT=0 \ + --env NCCL_SOCKET_IFNAME=enp129s0 \ + -v $MODELPATH:/app/models \ + -v $DATASETSPATH:/app/datasets \ + docker-archive:${IMAGE} \ + ${RAY_START_CMD} + + +# XXX JB +# NCCL_DMABUF_ENABLE=0 might need to be flipped for multinode training +# +# --env HIP_VISIBLE_DEVICES=0,1,2,3 \ +# --env ROCR_VISIBLE_DEVICES=0,1,2,3 \ +# --env CUDA_VISIBLE_DEVICES=0,1,2,3 \ +# +# --env NCCL_SOCKET_IFNAME=hsi0 \ +# --env RAY_EXPERIMENTAL_NO_SET_CUDA_VISIBLE_DEVICES=1 \ diff --git a/MLExamples/zenith/submit_zenith.sh b/MLExamples/zenith/submit_zenith.sh new file mode 100755 index 00000000..8e895e6c --- /dev/null +++ b/MLExamples/zenith/submit_zenith.sh @@ -0,0 +1,43 @@ +#!/bin/bash +#flux: --nodes=1 +#flux: --exclusive +#flux: --time-limit=6h +#flux: --job-name=zenith.train +# +#SBATCH --jobname=zenith.train +#SBATCH --time=06:00:00 +#SBATCH --account=tcp +#SBATCH --nodes=1 +#SBATCH --gres=gpu:4 + + +# path containing all of the LLMs here on the host, container location is always /app/models +SCRATCH="/p/lustre5" +MODELPATH="${SCRATCH}/`whoami`/hfmodels" +# path containing datasets for training +DATASETSPATH="${SCRATCH}/`whoami`/datasets" + +# load the rocm module and python environment +ROCMVERSION=7.2.2 +module load rocm/$ROCMVERSION + +# number of nodes assigned to this batch job +#RESOURCEINFO=`flux resource info` +#NNODES=`echo ${RESOURCEINFO} | awk '{print $1}'` +#NCORES=`echo ${RESOURCEINFO} | awk '{print $3}'` +#NGPUS=`echo ${RESOURCEINFO} | awk '{print $5}'` +#CORESPERNODE=$((NCORES / NNODES)) +#GPUSPERNODE=$((NGPUS / NNODES)) +NNODES=1 +NCORES=96 +NGPUS=4 +CORESPERNODE=96 +GPUSPERNODE=4 + +# when the workload gets heavy, ray spews this annoying message - filter it out +WARNING_STRING="PlacementGroupCleaner" +echo "Booting up Ray containers on ${NNODES} nodes with ${CORESPERNODE} cores per node and ${GPUSPERNODE} gpus per node" +# Usage: zenith_container_launcher.sh +#stdbuf -oL flux run -N ${NNODES} --ntasks=${NNODES} --gpus-per-task=${GPUSPERNODE} --cores-per-task=${CORESPERNODE} zenith_container_launcher.sh ${MODELPATH} ${DATASETSPATH} 2>&1 | grep --line-buffered -v ${WARNING_STRING} +stdbuf -oL srun -N ${NNODES} --ntasks=${NNODES} --gpus-per-task=${GPUSPERNODE} --cores-per-task=${CORESPERNODE} zenith_container_launcher.sh ${MODELPATH} ${DATASETSPATH} 2>&1 | grep --line-buffered -v ${WARNING_STRING} + diff --git a/MLExamples/zenith/zenith_container_launcher.sh b/MLExamples/zenith/zenith_container_launcher.sh new file mode 100755 index 00000000..2d760a0f --- /dev/null +++ b/MLExamples/zenith/zenith_container_launcher.sh @@ -0,0 +1,287 @@ +#!/bin/bash +# +# automates the launch of the container + ray.train kernel +# zenith uses a split-fabric approach where the control plane (Ray/GSC/ethernet) +# is separate from the data plane (training/RCCL/hsi) +# + +# arg checking +if [ $# -lt 2 ]; then + echo "Usage: $0 " + exit 1 +fi +MODELPATH="$1" # directory holding our LLMs +DATASETSPATH="$2" # directory holding our datasets for training + +# arg checking on model path +if [ ! -d "${MODELPATH}" ]; then + echo "Error: Model path directory ${MODELPATH} does not exist" + exit 1 +fi + +# get rid of any container logs that might be laying around from a previous run +rm -f container.*.log + +# number of nodes assigned to this job +RESOURCEINFO=`flux resource info` +NNODES=`echo ${RESOURCEINFO} | awk '{print $1}'` +NGPUS=`echo ${RESOURCEINFO} | awk '{print $5}'` +NCPUS=`echo ${RESOURCEINFO} | awk '{print $3}'` +GPUSPERNODE=$((NGPUS / NNODES)) +CPUSPERNODE=$((NCPUS / NNODES)) + +# get the list of nodes running within this flux job context +MYJOBID=`env | grep -w FLUX_JOB_ID | awk -F '=' '{print $2}'` +MYJOBHOSTS=`flux job hostpids ${MYJOBID} | sed 's/:[^:]*,/ /g' | sed 's/:[^:]*/ /g'` +NUMWORKERS=`echo ${MYJOBHOSTS} | wc -w` +NUMWORKERS=$((NUMWORKERS - 1)) +# the first one in the list will be designated the head +HEADNODE=`echo ${MYJOBHOSTS} | awk '{print $1}'` +MYNODE=`/usr/bin/hostname` + +# if it's a single node job, the single ray instance is head +if [ ${NNODES} == 1 ]; then + HEADNODE=${MYNODE} + NODE_TYPE="head" + # HSI IP address + ifconfig hsi0 | grep inet | awk '{print $2}' > container.headnode_hsi_address + # vllm needs to listen on the ethernet device for API serving + ifconfig enp129s0 | grep inet | awk '{print $2}' > container.headnode_eth_address +else + # the first node of the flux job alloc is the "head", all others are "workers" for communication purposes + if [ ${NNODES} -gt 1 ] && [ ${MYNODE} == ${HEADNODE} ]; then + NODE_TYPE="head" + # all nodes need to know the HSI IP address of the head + ifconfig hsi0 | grep inet | awk '{print $2}' > container.headnode_hsi_address + # vllm needs to listen on the ethernet device for API serving + ifconfig enp129s0 | grep inet | awk '{print $2}' > container.headnode_eth_address + else + NODE_TYPE="worker" + fi +fi + +# echo to stdout if we are the head node +function headecho() { + if [ ${MYNODE} == ${HEADNODE} ]; then + stdbuf -oL echo "$@" + fi +} + +# echo to stdout if we are a worker node +function workerecho() { + if [ ${MYNODE} != ${HEADNODE} ]; then + stdbuf -oL echo "$@" + fi +} + +# current rev +ZENITH_VERSION=`cat VERSION` +headecho "Launching Zenith version ${ZENITH_VERSION}" +# output ASCII art logo +headecho '' +headecho ' ___ ___ ___ ___ ' +headecho ' /\__\ /\__\ /\ \ /\ \ ' +headecho ' /::| | /:/ _/_ \:\ \ ___ ___ \:\ \ ' +headecho ' /:/:| | /:/ /\__\ \:\ \ /\__\ /\__\ \:\ \ ' +headecho ' /:/|:| |__ /:/ /:/ _/_ _____\:\ \ /:/__/ /:/ / ___ /::\ \ ' +headecho ' /:/ |:| /\__\ /:/_/:/ /\__\ /::::::::\__\ /::\ \ /:/__/ /\ /:/\:\__\' +headecho ' \/__|:|/:/ / \:\/:/ /:/ / \:\~~\~~\/__/ \/\:\ \__ /::\ \ \:\/:/ \/__/' +headecho ' |:/:/ / \::/_/:/ / \:\ \ ~~\:\/\__\ /:/\:\ \ \::/__/ ' +headecho ' |::/ / \:\/:/ / \:\ \ \::/ / \/__\:\ \ \:\ \ ' +headecho ' |:/ / \::/ / \:\__\ /:/ / \:\__\ \:\__\ ' +headecho ' |/__/ \/__/ \/__/ \/__/ \/__/ \/__/ ' +headecho '' +sleep 5 # wait for a bit to flush + +# output the job resource info +headecho "${NNODES} total nodes, headnode is ${HEADNODE}, mynode is ${MYNODE} which is the head node" +workerecho "${NNODES} total nodes, headnode is ${HEADNODE}, mynode is ${MYNODE} which is 1 of ${NUMWORKERS} workers" +sleep 10 # wait just a tad for all workers to get into the run state + +# ensure a race condition doesn't exist whereby the head node hasn't yet written out it's interface IP +if [ ${NODE_TYPE} == "worker" ]; then + # wait for the head node to write the address files + MAX_RETRIES=30 + RETRIES=0 + while [ ! -f container.headnode_eth_address ] && [ $RETRIES -lt $MAX_RETRIES ]; do + sleep 2 + RETRIES=$((RETRIES + 1)) + done + + if [ ! -f container.headnode_eth_address ]; then + echo "Error: Timed out waiting for container.headnode_eth_address" + exit 1 + fi +fi + +# launch the head/worker containers across the nodes for multinode training run +echo "starting up container of type ${NODE_TYPE} on ${MYNODE} in the background" +headecho "NOTE: it can take 5-10 minutes to copy over the image blobs" +HEADNODE_HSI_ADDRESS=`cat container.headnode_hsi_address` +HEADNODE_ETH_ADDRESS=`cat container.headnode_eth_address` + +# launch the container on each node (head + workers) +if [ ${NNODES} == 1 ]; then + state_token="single" +else + state_token="multi" +fi +# ray containers will communicate over the ethernet device, but RCCL training will occur over slingshot +/bin/bash run_container.sh ${HEADNODE_ETH_ADDRESS} --${NODE_TYPE} ${MODELPATH} ${DATASETSPATH} ${state_token} > container.${MYNODE}.log 2>&1 & + +# on the ray cluster, the head node has a virtual state with access to all of the GPUs on the allocation +# first, check to make sure that all containers+ray have come up on their respective nodes +if [ ${MYNODE} == ${HEADNODE} ]; then + + # give containers a bit of a chance to get running before we go into a loop to check on them + echo "*** Starting up all containers to form the ray virtual cluster spanning the job allocation nodes ***" + sleep 20 + + # wait for ray to start on all workers + ALL_STARTED=0 + COUNTER=1 ; MAXCOUNTER=30 + while [ ${ALL_STARTED} -eq 0 ]; do + + # exit if we hit the max attempts + if [ ${COUNTER} == ${MAXCOUNTER} ]; then + echo "*** container startup failed, exiting after ${MAXCOUNTER} attempts ***" + exit 1 + fi + + # loop over all hosts + STARTED_SUM=0 + for i in `seq 1 ${NNODES}` + do + HOST_ELEMENT=`echo $MYJOBHOSTS | cut -d " " -f $i` + HOST_FILENAME="container.${HOST_ELEMENT}.log" + # definitely not running if log file hasn't even been created yet + if [ -e ${HOST_FILENAME} ]; then + GREP_STRING=`grep "Ray runtime started" ${HOST_FILENAME} > /dev/null ; echo $?` + if [ ${GREP_STRING} == 0 ]; then + HOST_IS_FINISHED=1 + else + HOST_IS_FINISHED=0 + fi + else + HOST_IS_FINISHED=0 + fi + # accumulate until we account for every container, up to NNODES + STARTED_SUM=$((STARTED_SUM + ${HOST_IS_FINISHED})) + done + + if [ ${STARTED_SUM} -eq ${NNODES} ]; then + ALL_STARTED=1 + echo "*** All workers have successfully started ray ***" + sleep 5 + else + ALL_STARTED=0 + NUMSECS=60 + echo "Runtime check counter ${COUNTER} of ${MAXCOUNTER}: ${STARTED_SUM} out of ${NNODES} ray instances are running" + echo "Runtime check counter ${COUNTER} of ${MAXCOUNTER}: HEAD is waiting ${NUMSECS} secs before checking worker startup status again" + sleep $NUMSECS + fi + + # increment the attempt counter + COUNTER=$((COUNTER + 1)) + + done + + # health check stage + headecho "*** Running series of health checks before launching training ***" + + # run a test of raw cxi device communication first + headecho "*** Checking that HPE slingshot NICs are up and communicating ***" + if [ ${MYNODE} == ${HEADNODE} ]; then + # output basic cxi info of the devices first + podman exec node /opt/libfabric/bin/fi_info -p cxi + # start the pingpong cxi server on the head + #podman exec node /opt/libfabric/bin/fi_pingpong -p cxi -d hsi0 -I 1000 -S 1000000 + else + # start the pingpong cxi client on each worker + #podman exec node /opt/libfabric/bin/fi_pingpong -p cxi -d hsi0 -I 1000 -S 1000000 ${HEADNODE_HSI_ADDRESS} + echo + fi + + # flash attention 2 ROCm check + headecho "*** Checking that container flash attention is using ROCm FA2 ***" + HEALTH_FA2_KERNEL=ray_health_fa2.py + podman cp ${HEALTH_FA2_KERNEL} node:/app/${HEALTH_FA2_KERNEL} + podman exec node python ${HEALTH_FA2_KERNEL} + + # run a somewhat intense RCCL comms test to ensure ray communication working properly over fabric + HEALTH_RCCL_KERNEL=ray_health_rccl.py + podman cp ${HEALTH_RCCL_KERNEL} node:/app/${HEALTH_RCCL_KERNEL} + headecho "*** Running 1 GB per GPU all-reduce over the compute domain to stress test the RCCL fabric, launching ${HEALTH_RCCL_KERNEL} on ${NNODES} nodes with ${CPUSPERNODE} CPUs per node and ${GPUSPERNODE} GPUs per node ***" + podman exec --env NCCL_DEBUG="INFO" --env NCCL_DEBUG_SUBSYS="INIT,ENV,NET" node python ${HEALTH_RCCL_KERNEL} ${NNODES} ${CPUSPERNODE} ${GPUSPERNODE} + + # exercise a small kernel across all ray nodes to test overall health + HEALTH_OVERALL_KERNEL=ray_health_overall.py + podman cp ${HEALTH_OVERALL_KERNEL} node:/app/${HEALTH_OVERALL_KERNEL} + headecho "*** Launching tiny test kernel over the compute domain to test the overall health of the Ray cluster, launching ${HEALTH_OVERALL_KERNEL} on ${NNODES} nodes with ${CPUSPERNODE} CPUs per node and ${GPUSPERNODE} GPUs per node ***" + podman exec node python ${HEALTH_OVERALL_KERNEL} ${NNODES} ${CPUSPERNODE} ${GPUSPERNODE} + + headecho "*** All RCCL comm pattern health checks passed, moving to dataset preprocessing now ***" + + # data preprocessing stage + PREPROCESS_CONFIG=ministral-3-14B-cpt-science.preprocess.yaml + + # training stage + TRAIN_CONFIG=ministral-3-14B-cpt-science.train.yaml + #TRAIN_CONFIG=ministral-3-14B-fft-hedp.yaml + #TRAIN_CONFIG=gpt-oss-20b-fft-hedp.yaml + #TRAIN_CONFIG=mistral-small-4-119B-fft-hedp.yaml + + # cp our training config to the container working filesystem + TRAIN_CONFIG_FILENAME=$(basename "${TRAIN_CONFIG}") + PREPROCESS_CONFIG_FILENAME=$(basename "${PREPROCESS_CONFIG}") + for f in *.yaml *.json; do podman cp "$f" node:/app/; done + + # determione the job size specific values + TRAIN_RAY_NWORKERS=$((NNODES * GPUSPERNODE)) + TRAIN_NGPUS_PER_WORKER=1 + TRAIN_NCPUS_PER_WORKER=$((CPUSPERNODE / GPUSPERNODE)) + PREPROCESS_NCPUS_DATASETS=$((NNODES * CPUSPERNODE / 12)) + headecho "Setting ${TRAIN_RAY_NWORKERS} Ray workers in axolotl config, with:" + headecho " ${TRAIN_NGPUS_PER_WORKER} GPUs and ${TRAIN_NCPUS_PER_WORKER} CPUs assigned per worker" + headecho " ${PREPROCESS_NCPUS_DATASETS} CPUs assigned to dataset tokenization across the entire Ray worker allocation" + + # append job specific values to preprocessing config + PREPROCESS_DATASET_PREP_FILENAME="/app/datasets/zenith_last_run_dataprep.`date +%Y%m%d`" + podman exec node /bin/bash -c "echo 'dataset_num_proc: ${PREPROCESS_NCPUS_DATASETS}' >> /app/${PREPROCESS_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'dataloader_num_workers: 2' >> /app/${PREPROCESS_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'dataloader_prefetch_factor: 2' >> /app/${PREPROCESS_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'dataset_prepared_path: ${PREPROCESS_DATASET_PREP_FILENAME}' >> /app/${PREPROCESS_CONFIG_FILENAME}" + + # append the dataset info and ray worker resources for training + podman exec node /bin/bash -c "echo 'dataset_prepared_path: ${PREPROCESS_DATASET_PREP_FILENAME}' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'dataset_num_proc: ${PREPROCESS_NCPUS_DATASETS}' >> /app/${TRAIN_CONFIG_FILENAME}" + # XXX JB + podman exec node /bin/bash -c "echo 'dataloader_num_workers: 0' >> /app/${TRAIN_CONFIG_FILENAME}" + #podman exec node /bin/bash -c "echo 'dataloader_prefetch_factor: 2' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'dataset_prepared_path: ${PREPROCESS_DATASET_PREP_FILENAME}' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'datasets:' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo ' - path: ${PREPROCESS_DATASET_PREP_FILENAME}' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo ' type: completion' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo ' ds_type: arrow' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo '' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'use_ray: true' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'ray_num_workers: ${TRAIN_RAY_NWORKERS}' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo 'resources_per_worker:' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo ' GPU: ${TRAIN_NGPUS_PER_WORKER}' >> /app/${TRAIN_CONFIG_FILENAME}" + podman exec node /bin/bash -c "echo ' CPU: ${TRAIN_NCPUS_PER_WORKER}' >> /app/${TRAIN_CONFIG_FILENAME}" + + # preprocess the dataset on the CPUs + headecho "*** Preprocessing the dataset, following commands in ${TRAIN_CONFIG_FILENAME} ***" + # launch the training with extreme verbosity + headecho "*** Launching large-scale training kernel with deep diagnostics ***" + podman exec node python -m axolotl.cli.preprocess ministral-3-14B-cpt-science.preprocess.yaml --world_size 1 --local_rank 0 + + # launch the training + headecho "*** Launching large-scale training kernel from ${TRAIN_CONFIG_FILENAME} on ${NNODES} nodes with ${CPUSPERNODE} CPUs per node and ${GPUSPERNODE} GPUs per node ***" + # debug line + #podman exec node python -m axolotl.cli.train ${TRAIN_CONFIG_FILENAME} --overwrite_output_dir=true --report_to=none --debug + podman exec node python -m axolotl.cli.train ${TRAIN_CONFIG_FILENAME} --overwrite_output_dir=true --report_to=none + + +fi + From 8c854e4b3292706e92166eec5cdb8f98d15d5822 Mon Sep 17 00:00:00 2001 From: Jon Belof Date: Thu, 11 Jun 2026 13:27:08 +0000 Subject: [PATCH 2/5] icf_4agent: add conversational-PI debrief, fix multi-round campaigns, update docs Bring the icf_4agent example up to date with the latest working version. Features / fixes: - Conversational-PI debrief: after a campaign, users can chat with the Principal Investigator about the results ("why did the best design win?", "how robust is it to defects?"). Adds a tool-free conversational PI agent, a session-scoped store of all campaign results, multi-turn memory, and intent-based routing that separates analysis questions from run requests (app.py). - Multi-round campaign fix: AutoGen's max_round counts messages, not design iterations, so campaigns ran only ~1 round. Convert the design-round constants into a message budget and wire is_termination_msg so the PI's TERMINATE / yield-convergence actually stops the chat early (app.py). - Add icf_viz.py (implosion movie + diagnostic time-history plots) and the AMD logo assets used by the Gradio UI and media mode. - Update README.md and docs/summary.tex to document the debrief mode and the four operational modes. - Add .gitignore to exclude the venv, caches, logs, and generated media. Note: docs/summary.pdf is NOT regenerated here (no pdflatex available in this environment); rebuild it from summary.tex before relying on the PDF. Co-Authored-By: Claude Opus 4.8 (1M context) --- MLExamples/icf_4agent/.gitignore | 16 + MLExamples/icf_4agent/README.md | 46 +- MLExamples/icf_4agent/amd_logo.png | Bin 0 -> 21972 bytes MLExamples/icf_4agent/amd_logo_white.png | Bin 0 -> 61822 bytes MLExamples/icf_4agent/app.py | 726 +++++++++++++++++++++-- MLExamples/icf_4agent/create_aivenv.sh | 2 +- MLExamples/icf_4agent/docs/summary.tex | 38 +- MLExamples/icf_4agent/icf_core.py | 155 +++-- MLExamples/icf_4agent/icf_viz.py | 108 ++++ MLExamples/icf_4agent/start_vllm.sh | 13 +- 10 files changed, 986 insertions(+), 118 deletions(-) create mode 100644 MLExamples/icf_4agent/.gitignore create mode 100644 MLExamples/icf_4agent/amd_logo.png create mode 100644 MLExamples/icf_4agent/amd_logo_white.png create mode 100644 MLExamples/icf_4agent/icf_viz.py diff --git a/MLExamples/icf_4agent/.gitignore b/MLExamples/icf_4agent/.gitignore new file mode 100644 index 00000000..b209c02b --- /dev/null +++ b/MLExamples/icf_4agent/.gitignore @@ -0,0 +1,16 @@ +# Python virtual environment +aivenv/ +venv/ + +# Caches +.cache/ +.gradio/ +__pycache__/ +*.pyc + +# Logs +*.log + +# Generated media / simulation output +media_output/ +implosion_frames/ diff --git a/MLExamples/icf_4agent/README.md b/MLExamples/icf_4agent/README.md index 9e169c8b..36f04ae7 100644 --- a/MLExamples/icf_4agent/README.md +++ b/MLExamples/icf_4agent/README.md @@ -1,6 +1,6 @@ # Adversarial Multi-Agent ICF Capsule Optimizer -A multi-agent system that autonomously optimizes Inertial Confinement Fusion (ICF) capsule designs under realistic manufacturing uncertainty. A Design Explorer agent maximizes fusion yield while a Defect Adversary agent stress-tests designs with manufacturing imperfections, orchestrated by a Principal Investigator agent — all powered by LLM reasoning and a fast physics surrogate. +A multi-agent system that autonomously optimizes Inertial Confinement Fusion (ICF) capsule designs under realistic manufacturing uncertainty. A Design Explorer agent maximizes fusion yield while a Defect Adversary agent stress-tests designs with manufacturing imperfections, orchestrated by a Principal Investigator agent — all powered by LLM reasoning and a fast physics surrogate. After a campaign runs, the same Principal Investigator can be **interactively queried** about the results: it answers analysis questions ("why did the best design win?", "how robust is it to defects?") from the recorded run data, with multi-turn memory across the conversation. ## Architecture @@ -31,6 +31,13 @@ A multi-agent system that autonomously optimizes Inertial Confinement Fusion (IC The agents communicate through AutoGen's group chat with constrained speaker transitions. Only the PI can invoke the physics simulation, ensuring a structured optimization loop. The physics engine is decoupled from the agents via the Model Context Protocol (MCP), allowing the backend to be swapped from this fast surrogate to a full radiation hydrodynamics code without changing any agent logic. +Every campaign's structured results (best design, all sampled designs and their yields, mean/σ statistics, sweep curves, rendered media) are retained in a session-scoped store. A dedicated **conversational PI agent** (no tool access, separate from the orchestrating PI) draws on this store to answer follow-up analysis questions, so the user can interrogate what was run without launching a new simulation. The router automatically distinguishes a *request to run* (e.g. "optimize…", "sweep…", "show a movie…") from a *question about prior results*, sending the latter to the debrief agent. + +The system runs against either backend (selected by `ICF_API_TYPE`): + +- **`anthropic`** — a frontier cloud model. The PI invokes the simulation through AutoGen's native tool-calling. +- **`openai`** — a local, OpenAI-compatible endpoint (vLLM serving the fine-tuned `gptoss-20b-hedp` weights). Because smaller open-weight models are unreliable at formal tool-calling, in this mode the PI instead emits a plain-text `RUN_SIMULATION: R0=..., v0=..., ...` line, which a hook parses and executes against the MCP server, injecting the results back into the conversation. This mode also uses deterministic speaker scheduling, response sanitization (stripping stray tool-call/null tokens), and bounded conversation history so long campaigns stay within the model's context window. + ## Physics Model The surrogate implements a 0D deceleration-phase model combining: @@ -50,14 +57,15 @@ The system solves a min-max game: max_x min_d Y(x, d) ``` -where **x** = (R0, v0, T0, M_sh, M_hs) are design parameters and **d** = (delta, mode, roughness) are manufacturing defects, subject to a fixed kinetic energy budget: KE = ½ M_sh v0² = 0.015 × E_laser. +where **x** = (R0, v0, T0, M_sh, M_hs) are design parameters and **d** = (delta, mode, roughness) are manufacturing defects, subject to a kinetic energy budget KE = ½ M_sh v0² = 0.015 × E_laser. The laser energy E_laser is parsed from the user's request (any value, not a fixed 3 MJ), and the resulting budget is computed in code and handed to the agents — so a request for, say, a 5 MJ laser produces a 75 kJ budget and the agents scale the design accordingly. ## Files | File | Description | |---|---| -| `app.py` | Multi-agent orchestration, Gradio UI, LLM configuration | -| `icf_core.py` | Standalone physics engine (ODE solver) | +| `app.py` | Multi-agent orchestration, request routing (single/sweep/media/analysis), conversational-PI debrief, session result store, Gradio UI, LLM configuration | +| `icf_core.py` | Standalone physics engine (`solve_implosion` / `compute_metrics` + CLI) | +| `icf_viz.py` | Media generation: implosion movie (ffmpeg) and diagnostic time-history plots | | `icf_mcp_server.py` | MCP tool server wrapping the physics engine with parameter validation | | `start_app.sh` | Launch script for the agent application | | `start_vllm.sh` | Launch script for local vLLM inference server | @@ -122,11 +130,35 @@ Start the vLLM server in one terminal, then the app in another: ./start_app.sh ``` -The app opens a Gradio web UI with a public share link (no X server needed). Enter a prompt like: +The app opens a Gradio web UI with a public share link (no X server needed). The interface uses the Origin theme (dark mode by default), shows the AMD logo, streams the agent conversation in a chat panel, and renders plots and movies in side panels. Agent messages stream to the browser in real time as each agent contributes. + +### Usage Modes + +The request is routed by keyword into one of four modes: + +**1. Single design campaign** (default) — one full agent optimization at a given laser energy. > Find a robust capsule design that maximizes fusion yield at 3 MJ laser energy -Agent messages stream to the browser in real time as each agent contributes. +**2. Laser-energy sweep** (triggered by "sweep", "scan", "as a function of", "vs laser energy", "curve"). Runs one full campaign per energy point and plots **mean fusion yield with ±1σ error bars** (the spread of yields the agents explore at each energy, reflecting sensitivity to manufacturing defects). The energy points are parsed from the request, supporting **multiple range segments each with their own step size**: + +> Sweep yield vs laser energy from 1.0 to 2.0 MJ in increments of 0.1 MJ and 2.0 to 10.0 MJ in increments of 1.0 MJ + +Also accepts a point count ("...from 1 to 10 MJ with 6 points") or a single uniform step. + +**3. Simulation media** (triggered by "movie", "animation", "render", "show the implosion", "diagnostic", etc.). Runs a campaign, takes the best design found, and renders an **implosion movie** (density field through stagnation) plus **diagnostic time-history plots** (radius, areal density, temperature). + +> Optimize a design at 4 MJ and show me a movie of the implosion + +**4. Analysis / debrief** (triggered once at least one campaign has run, by any question that is not itself a run request — e.g. it ends in "?" or uses words like "why", "how", "compare", "explain", "robust"). Instead of starting a new simulation, the question is routed to a conversational Principal Investigator that reasons over all results collected this session and replies in the chat panel. The exchange has multi-turn memory, so follow-up questions retain context. + +> Why did the best design win, and how robust is it to the defects we tried? +> Which single defect parameter hurt the yield the most? +> Compare the 3 MJ and 5 MJ campaigns. + +This mode is purely interpretive: the debrief agent has no simulation tool and never alters the design — it only analyzes the recorded data (best design, every sampled design and its yield, mean/σ, and any sweep curve). To start fresh work, use an explicit run phrasing ("optimize…", "sweep…", "render a movie…"). + +Each campaign is capped at a fixed number of agent rounds (`SWEEP_MAX_ROUNDS` / `SINGLE_MAX_ROUNDS` / `MEDIA_MAX_ROUNDS` in `app.py`) and also stops early when the yield plateaus (improvement < 5% for two consecutive rounds). If a campaign produces no valid simulation, a physically reasonable fallback design at the target energy keeps the sweep/media output populated. ### Running the Physics Engine Standalone @@ -178,7 +210,7 @@ Each agent role (Explorer, Frontier) has independent settings with fallback defa | `ICF_VLLM_IMAGE_TAR` | `~/vllm_rocm_nightly_main_20260531.tar` | vLLM container image tarball | | `ICF_VLLM_PORT` | `8000` | Port for the vLLM server | | `ICF_VLLM_TP_SIZE` | `1` | Tensor parallel degree (number of GPUs) | -| `ICF_VLLM_MAX_MODEL_LEN` | `4096` | Maximum sequence length | +| `ICF_VLLM_MAX_MODEL_LEN` | `16384` | Maximum sequence length | ## Parameter Bounds diff --git a/MLExamples/icf_4agent/amd_logo.png b/MLExamples/icf_4agent/amd_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6666b270fada2d3389ca57d604367164e03e1b71 GIT binary patch literal 21972 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 literal 0 HcmV?d00001 diff --git a/MLExamples/icf_4agent/amd_logo_white.png b/MLExamples/icf_4agent/amd_logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..440dd8be13666df546e2f13ea91cf0a28ff0ca17 GIT binary patch literal 61822 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%0AV7ayXpqpm&CcXYR%!tU=5{Wi*0?TG%bv!rv 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�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 literal 0 HcmV?d00001 diff --git a/MLExamples/icf_4agent/app.py b/MLExamples/icf_4agent/app.py index c5c3a13f..59f469d9 100644 --- a/MLExamples/icf_4agent/app.py +++ b/MLExamples/icf_4agent/app.py @@ -27,6 +27,38 @@ def _patched_init(self, **kwargs): ctor_kwargs["default_headers"] = default_headers self._client = Anthropic(**ctor_kwargs) _anthropic_module.AnthropicClient.__init__ = _patched_init +else: + from autogen.oai.client import OpenAIClient + _orig_message_retrieval = OpenAIClient.message_retrieval + def _safe_message_retrieval(self, response): + for choice in response.choices: + if hasattr(choice, "message") and choice.message: + if choice.message.tool_calls: + choice.message.tool_calls = None + if choice.message.function_call: + choice.message.function_call = None + if choice.message.content is None: + choice.message.content = "" + return _orig_message_retrieval(self, response) + OpenAIClient.message_retrieval = _safe_message_retrieval + + +# Hydrodynamic coupling efficiency: fraction of laser energy delivered to shell KE +ETA_COUPLING = 0.015 +DEFAULT_E_LASER = 3.0e6 # 3 MJ if the user doesn't specify + +def _parse_laser_energy(message): + """Extract the requested laser energy (in Joules) from the user's message. + Recognizes values in MJ or kJ; defaults to 3 MJ if none found.""" + import re + # Look for a number followed by MJ (with optional space, case-insensitive) + m = re.search(r"([0-9]*\.?[0-9]+)\s*MJ", message, re.IGNORECASE) + if m: + return float(m.group(1)) * 1e6 + m = re.search(r"([0-9]*\.?[0-9]+)\s*kJ", message, re.IGNORECASE) + if m: + return float(m.group(1)) * 1e3 + return DEFAULT_E_LASER def _parse_custom_headers(header_str): @@ -59,7 +91,7 @@ def _build_config(role): api_key = os.environ.get(f"{prefix}_API_KEY", "unused") base_url = _require_env(f"{prefix}_BASE_URL") model = os.environ.get(f"{prefix}_MODEL", "gptoss-20b-hedp") - entry = {"model": model, "api_key": api_key, "base_url": base_url} + entry = {"model": model, "api_key": api_key, "base_url": base_url, "max_tokens": 2048} else: api_key = _require_env(f"{prefix}_API_KEY", "ANTHROPIC_API_KEY") base_url = _require_env(f"{prefix}_BASE_URL", "ANTHROPIC_BASE_URL") @@ -105,6 +137,25 @@ async def _run_mcp_client(): return asyncio.run(_run_mcp_client()) + +# --- Per-campaign simulation result recorder --- +# Set to a list for the duration of a campaign; the simulation-execution code appends +# (params_dict, yield_MJ) for every run so the orchestrator can find the best design. +_active_recorder = None + +def _parse_yield_mj(result_text): + """Extract the fusion yield in MJ from an MCP result string; None if not found.""" + import re + m = re.search(r"Total Fusion Yield:\s*([\d.]+)\s*MJ", result_text or "") + return float(m.group(1)) if m else None + +def _record_result(params, result_text): + """Append a (params, yield_MJ) record to the active recorder, if one is set.""" + if _active_recorder is not None: + y = _parse_yield_mj(result_text) + if y is not None: + _active_recorder.append((dict(params), y)) + # --- Agent Definitions --- user_proxy = autogen.UserProxyAgent( @@ -116,7 +167,7 @@ async def _run_mcp_client(): ) _PI_SYSTEM_BASE = """\ -You are the Principal Investigator leading an ICF capsule design campaign on a NIF-class 3 MJ laser. +You are the Principal Investigator leading an ICF capsule design campaign. IMPORTANT: This is a DECELERATION-PHASE surrogate model. R0 is the shell radius at the START OF STAGNATION (after the laser drive is off), NOT the initial fabricated capsule radius. @@ -125,14 +176,19 @@ async def _run_mcp_client(): UNITS: All parameters are SI EXCEPT T0 which is in keV (not Kelvin, not eV). T0=1.0 means 1.0 keV. Do NOT convert to eV or Kelvin. -KNOWN-GOOD REFERENCE (produces ~7 MJ yield with no defects): +ENERGY BUDGET: The shell kinetic energy is constrained by the laser energy via a hydrodynamic +coupling efficiency of 1.5%: KE_budget = 0.015 * E_laser. The exact KE budget for THIS campaign +(based on the requested laser energy) is stated in the kickoff message below. Use THAT value. + +KNOWN-GOOD REFERENCE (produces ~7 MJ yield at the 45 kJ / 3 MJ budget, no defects): R0=1.5e-4 m, v0=-4.5e5 m/s, T0=1.0 keV, M_sh=2.5e-7 kg, M_hs=5e-9 kg PROTOCOL — follow this turn order strictly: -1. Address Design_Explorer by name and ask for capsule parameters. WAIT for their response. +1. Address Design_Explorer by name and ask for capsule parameters. State the KE budget for this + campaign explicitly. WAIT for their response. 2. After receiving the Explorer's parameters, VALIDATE the energy constraint: - KE = 0.5 * M_sh * v0^2 must be close to 0.015 * 3e6 = 45000 J. - If violated, ask the Explorer to revise. Do NOT proceed until KE ≈ 45 kJ. + KE = 0.5 * M_sh * v0^2 must be close to the campaign KE budget. + If violated, ask the Explorer to revise. Do NOT proceed until KE matches the budget. 3. Address Defect_Adversary by name and ask for defect parameters. WAIT for their response. 4. After receiving BOTH sets of parameters, request a simulation run. Do NOT propose parameters yourself — delegate to the specialists. @@ -146,7 +202,8 @@ async def _run_mcp_client(): Track the best yield from each round. Stop the campaign when EITHER: a) The yield improvement between the current best and the previous best is < 5% for 2 consecutive rounds (the design has converged — further iteration is unlikely to help). - b) You have completed 6 rounds (hard cap to prevent runaway optimization). + b) You reach the per-campaign round cap stated in the kickoff message (hard cap to + prevent runaway optimization). At the end of each round, report: "Round N: Yield = X.XX MJ (best so far: Y.YY MJ, change: +Z.Z%)" When stopping, summarize the best design found, its parameters, and its robustness to defects. End your final summary with TERMINATE.""" @@ -183,8 +240,9 @@ async def _run_mcp_client(): ALL VALUES MUST USE SCIENTIFIC NOTATION (e.g. 1.5e-4, not 150e-6 or 0.00015). ENERGY CONSTRAINT (mandatory): - KE = 0.5 * M_sh * v0^2 = 0.015 * 3e6 = 45000 J - Show your KE calculation with every proposal. + KE = 0.5 * M_sh * v0^2 must match the campaign KE budget. + The budget = 0.015 * E_laser; the Principal_Investigator will tell you the exact value in Joules. + Show your KE calculation with every proposal and confirm it matches the stated budget. PARAMETERS: R0 [m] deceleration-phase radius. Range: 8e-5 to 2.5e-4. Example: 1.5e-4 @@ -193,10 +251,11 @@ async def _run_mcp_client(): NOTE: T0 is in keV, NOT Kelvin and NOT eV. Just use the number (e.g. 1.2). M_sh [kg] shell mass. Range: 5e-8 to 1e-6. Example: 2.5e-7 M_hs [kg] initial hotspot mass. Range: 1e-9 to 5e-8. Example: 5e-9 + Note: higher laser energy allows a higher KE budget, so M_sh and/or |v0| can be larger. -KNOWN-GOOD BASELINE (yields ~7 MJ): +REFERENCE POINT (at the 45 kJ / 3 MJ budget, yields ~7 MJ): R0=1.5e-4, v0=-4.5e5, T0=1.0, M_sh=2.5e-7, M_hs=5e-9 - KE = 0.5 * 2.5e-7 * (4.5e5)^2 = 25312 J (uses 56% of budget — room to optimize) + KE = 0.5 * 2.5e-7 * (4.5e5)^2 = 25312 J. Scale M_sh/v0 to match the actual campaign budget. Reply with ONLY your 5 parameter values and KE check. Keep it brief.""" ) @@ -226,9 +285,43 @@ async def _run_mcp_client(): Round 3: combine whatever was most damaging.""" ) +# --- Conversational PI for post-campaign analysis ("debrief" mode) --- +# This is a SEPARATE agent from `principal_investigator`: it has no tool registered and no +# campaign protocol. It only reasons over already-collected results to answer the user's questions. +_PI_ANALYST_SYSTEM = """\ +You are the Principal Investigator for an ICF capsule design campaign, now in DEBRIEF mode. +The optimization campaigns have ALREADY run. You are given the structured results of every campaign +executed this session: the designs tried, their 8 input parameters, and the resulting fusion yields +(plus mean/std and any laser-energy sweep data). + +Your job is to ANALYZE these results and answer the researcher's questions. You may: + - identify the best design and explain why it performed well, + - compare designs and campaigns, discuss parameter trade-offs and trends, + - assess robustness to the defect parameters (delta, mode, roughness), + - comment on the physics (stagnation pressure, RT amplification, burn fraction, energy budget). + +Reason ONLY from the data provided. Do NOT call tools or run new simulations. If the data needed to +answer is not present, say so and suggest what campaign to run next. Be concise and quantitative. + +UNITS: SI throughout except T0 which is in keV. KE budget = 0.015 * E_laser.""" + +pi_analyst = autogen.AssistantAgent( + name="Principal_Investigator", + llm_config=config_frontier, + system_message=_PI_ANALYST_SYSTEM, +) + if API_TYPE == "anthropic": + def _run_icf_implosion_recorded(R0: float, v0: float, T0: float, M_sh: float, M_hs: float, + delta: float, mode: float, roughness: float) -> str: + """Runs the ICF deceleration surrogate via MCP. Requires 8 float parameters.""" + result = call_mcp_icf_server(R0, v0, T0, M_sh, M_hs, delta, mode, roughness) + _record_result({"R0": R0, "v0": v0, "T0": T0, "M_sh": M_sh, "M_hs": M_hs, + "delta": delta, "mode": mode, "roughness": roughness}, result) + return result + autogen.agentchat.register_function( - call_mcp_icf_server, + _run_icf_implosion_recorded, caller=principal_investigator, executor=user_proxy, name="run_icf_implosion", @@ -236,9 +329,37 @@ async def _run_mcp_client(): ) else: import re + + def _sanitize_content(sender, message, recipient, silent): + if isinstance(message, dict): + content = message.get("content") + if content is None: + reasoning = message.pop("reasoning", None) or message.pop("thinking", None) + message["content"] = reasoning if reasoning else "(no response)" + elif message is None: + message = "(no response)" + return message + + for _agent in [principal_investigator, explorer_agent, adversary_agent, user_proxy]: + _agent.register_hook("process_message_before_send", _sanitize_content) + + # Bound the context an agent sees so a long (up to 100-round) campaign never + # overflows the model's context window. Keep the first message (which carries the + # energy-budget instructions) plus the most recent KEEP_RECENT messages. + KEEP_RECENT = 12 + + def _trim_history(messages): + if not messages or len(messages) <= KEEP_RECENT + 1: + return messages + return [messages[0]] + messages[-KEEP_RECENT:] + + for _agent in [principal_investigator, explorer_agent, adversary_agent]: + _agent.register_hook("process_all_messages_before_reply", _trim_history) + def _auto_execute_simulation(sender, message, recipient, silent): - content = message.get("content", "") if isinstance(message, dict) else str(message) - match = re.search(r"RUN_SIMULATION:\s*(.+)", content) + content = (message.get("content") or "") if isinstance(message, dict) else str(message or "") + # Tolerate markdown around the keyword, e.g. "**RUN_SIMULATION**:" or "RUN_SIMULATION :" + match = re.search(r"RUN_SIMULATION\s*\**\s*:?\s*(R0\s*=.+)", content) if not match: return message param_str = match.group(1) @@ -251,6 +372,7 @@ def _auto_execute_simulation(sender, message, recipient, silent): required = ["R0", "v0", "T0", "M_sh", "M_hs", "delta", "mode", "roughness"] if all(k in params for k in required): result = call_mcp_icf_server(**{k: params[k] for k in required}) + _record_result({k: params[k] for k in required}, result) content += "\n\n--- SIMULATION RESULTS ---\n" + result else: content += f"\n\nERROR: Missing parameters. Got: {list(params.keys())}. Need: {required}" @@ -262,33 +384,81 @@ def _auto_execute_simulation(sender, message, recipient, silent): principal_investigator.register_hook("process_message_before_send", _auto_execute_simulation) -# --- Gradio Interface --- -def chat_with_swarm(user_message: str, history: list): +# --- Campaign runner --- +def _build_groupchat(): + """Construct a fresh GroupChat + manager with per-campaign speaker state.""" + agents = [user_proxy, principal_investigator, explorer_agent, adversary_agent] if API_TYPE == "anthropic": - agents = [user_proxy, principal_investigator, explorer_agent, adversary_agent] allowed_transitions = { user_proxy: [principal_investigator], principal_investigator: [explorer_agent, adversary_agent, user_proxy], explorer_agent: [principal_investigator], adversary_agent: [principal_investigator], } + groupchat = autogen.GroupChat( + agents=agents, messages=[], max_round=30, + allowed_or_disallowed_speaker_transitions=allowed_transitions, + speaker_transitions_type="allowed", + ) else: - agents = [user_proxy, principal_investigator, explorer_agent, adversary_agent] - allowed_transitions = { - user_proxy: [principal_investigator], - principal_investigator: [explorer_agent, adversary_agent], - explorer_agent: [principal_investigator], - adversary_agent: [principal_investigator], - } - groupchat = autogen.GroupChat( - agents=agents, - messages=[], - max_round=30, - allowed_or_disallowed_speaker_transitions=allowed_transitions, - speaker_transitions_type="allowed", + _turn_cycle = [principal_investigator, explorer_agent, + principal_investigator, adversary_agent, + principal_investigator] + _cycle_state = {"idx": -1} + + def _deterministic_speaker(last_speaker, groupchat): + if last_speaker == user_proxy: + _cycle_state["idx"] = 0 + return principal_investigator + _cycle_state["idx"] = (_cycle_state["idx"] + 1) % len(_turn_cycle) + return _turn_cycle[_cycle_state["idx"]] + + groupchat = autogen.GroupChat( + agents=agents, messages=[], max_round=30, + speaker_selection_method=_deterministic_speaker, + ) + return groupchat + + +def run_campaign(user_message, e_laser, max_rounds, result_holder): + """Run one full multi-agent optimization campaign at a given laser energy. + + Generator: yields the growing transcript string as agents speak. On completion, + populates result_holder with {best_yield, best_params, results}. + """ + global _active_recorder + groupchat = _build_groupchat() + # AutoGen's max_round counts individual messages (turns), NOT design iterations. One + # design round (PI -> Explorer -> PI -> Adversary -> PI + simulation/eval) spans a full + # speaker cycle of ~5 messages; the anthropic backend adds ~2 more per round for the tool + # call + response. Convert the requested number of DESIGN rounds into a message budget, + # with headroom for the kickoff and the final summary. + msgs_per_round = 7 if API_TYPE == "anthropic" else 5 + groupchat.max_round = 3 + max_rounds * msgs_per_round + + def _is_termination(msg): + # Match TERMINATE only at the END of a message (the PI's "end your summary with + # TERMINATE" convention). Checking for it anywhere would also match instruction text + # that merely mentions the word (e.g. the kickoff's round-budget note). + content = msg.get("content") if isinstance(msg, dict) else msg + return isinstance(content, str) and content.rstrip().rstrip(".").upper().endswith("TERMINATE") + + manager = autogen.GroupChatManager( + groupchat=groupchat, llm_config=config_frontier, is_termination_msg=_is_termination) + + ke_budget = ETA_COUPLING * e_laser + budget_note = ( + f"CAMPAIGN ENERGY BUDGET: Requested laser energy = {e_laser/1e6:.2f} MJ. " + f"With {ETA_COUPLING*100:.1f}% hydrodynamic coupling, the shell kinetic energy budget is " + f"KE = {ke_budget:.0f} J ({ke_budget/1e3:.1f} kJ). " + f"All capsule designs must satisfy 0.5 * M_sh * v0^2 ~= {ke_budget:.0f} J. " + f"ROUND BUDGET: run up to {max_rounds} design rounds; iterate the design across " + f"multiple rounds and only output TERMINATE once the yield has converged per the " + f"stopping criteria (do not stop after a single round)." ) - manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=config_frontier) + recorder = [] + _active_recorder = recorder chat_error = [] done = threading.Event() @@ -296,7 +466,7 @@ def _run_chat(): try: user_proxy.initiate_chat( manager, - message=f"USER REQUEST: {user_message}. Principal_Investigator, please coordinate the swarm to find a robust design." + message=f"USER REQUEST: {user_message}\n\n{budget_note}\n\nPrincipal_Investigator, please coordinate the swarm to find a robust design at this energy budget." ) except Exception as e: chat_error.append(str(e)) @@ -329,14 +499,498 @@ def _run_chat(): yield accumulated.strip() thread.join(timeout=5) + _active_recorder = None if chat_error: accumulated += f"\n\n---\n**ERROR:** {chat_error[0]}" yield accumulated.strip() -if __name__ == "__main__": - demo = gr.ChatInterface( - fn=chat_with_swarm, - title="Agentic RL Multi-Agent Fusion Capsule Optimizer", + # Aggregate statistics over every simulation run this campaign. + import statistics + yields = [y for _params, y in recorder] + best_yield, best_params = 0.0, None + for params, y in recorder: + if y > best_yield: + best_yield, best_params = y, params + mean_yield = statistics.fmean(yields) if yields else 0.0 + std_yield = statistics.stdev(yields) if len(yields) > 1 else 0.0 + result_holder["best_yield"] = best_yield + result_holder["best_params"] = best_params + result_holder["results"] = recorder + result_holder["yields"] = yields + result_holder["mean_yield"] = mean_yield + result_holder["std_yield"] = std_yield + + +# --- Request routing helpers --- +# Trigger words that mark a message as a request to RUN something (a sweep or media render). +# Module-level so both _detect_mode and _is_analysis_request share one source of truth. +SWEEP_KEYWORDS = ["sweep", "scan", "as a function of", "vs laser", "versus laser", + "curve", "parameter study", "yield vs"] +MEDIA_KEYWORDS = ["movie", "animation", "animate", "video", "render", "show the implosion", + "show me the implosion", "show the graph", "show the plot", "diagnostic", + "time histor", "density field"] + +def _detect_mode(message): + m = message.lower() + if any(k in m for k in SWEEP_KEYWORDS): + return "sweep" + if any(k in m for k in MEDIA_KEYWORDS): + return "media" + return "single" + +def _parse_num_points(message, default=5, cap=12): + import re + m = re.search(r"(\d+)\s*(?:-?\s*point|points|samples|sample|values|energies)", message, re.IGNORECASE) + if m: + return max(2, min(cap, int(m.group(1)))) + return default + +def _parse_energy_range(message): + """Return (lo_J, hi_J) for a sweep. Defaults to 1-10 MJ.""" + import re + m = re.search(r"(?:from|between)?\s*([0-9]*\.?[0-9]+)\s*(?:to|-|and|–|—)\s*([0-9]*\.?[0-9]+)\s*MJ", + message, re.IGNORECASE) + if m: + return float(m.group(1)) * 1e6, float(m.group(2)) * 1e6 + return 1.0e6, 10.0e6 + +def _parse_step_mj(message): + """Return a step size in MJ if the user specified one (e.g. 'increments of 1', + 'in steps of 0.5', 'every 2 MJ'), else None.""" + import re + m = re.search(r"(?:increments?|steps?|every|spacing|interval)\s*(?:of\s*)?([0-9]*\.?[0-9]+)\s*(?:MJ)?", + message, re.IGNORECASE) + if m: + try: + v = float(m.group(1)) + return v if v > 0 else None + except ValueError: + return None + return None + +def _segment_energies(lo, hi, step_mj, default_n): + """Energies (J) for a single range. Uses step if given, else default_n points.""" + if hi < lo: + lo, hi = hi, lo + if step_mj: + step = step_mj * 1e6 + n = int(round((hi - lo) / step)) + 1 + n = max(2, n) + energies = [lo + step * i for i in range(n)] + if energies[-1] < hi - 1e-6: + energies.append(hi) + return energies + if default_n <= 1: + return [lo] + return [lo + (hi - lo) * i / (default_n - 1) for i in range(default_n)] + + +def _sweep_energies(message, cap=30): + """Build the list of laser energies (Joules) for a sweep from the user's request. + + Supports MULTIPLE range segments, each with its own optional step size, e.g. + "from 1 to 2 MJ in increments of 0.1 and 2 to 10 MJ in increments of 1". + Each "X to Y MJ" range is paired with the nearest following step phrase (if any) + before the next range. Segments are concatenated and de-duplicated. Falls back to + a single range / point-count / default. Capped to `cap` campaigns total. + """ + import re + range_re = re.compile( + r"([0-9]*\.?[0-9]+)\s*(?:to|-|–|—|and)\s*([0-9]*\.?[0-9]+)\s*MJ", re.IGNORECASE) + step_re = re.compile( + r"(?:increments?|steps?|every|spacing|interval)\s*(?:of\s*)?([0-9]*\.?[0-9]+)", + re.IGNORECASE) + + ranges = list(range_re.finditer(message)) + default_n = _parse_num_points(message) + + if not ranges: + lo, hi = _parse_energy_range(message) + energies = _segment_energies(lo, hi, _parse_step_mj(message), default_n) + else: + energies = [] + for i, rm in enumerate(ranges): + lo = float(rm.group(1)) * 1e6 + hi = float(rm.group(2)) * 1e6 + # Find a step phrase that occurs after this range but before the next one. + seg_end = ranges[i + 1].start() if i + 1 < len(ranges) else len(message) + sm = step_re.search(message, rm.end(), seg_end) + step_mj = float(sm.group(1)) if sm else None + energies.extend(_segment_energies(lo, hi, step_mj, default_n)) + + # De-duplicate (shared endpoints between adjacent segments) while preserving order. + seen, deduped = set(), [] + for e in energies: + key = round(e / 1e5) # 0.1 MJ resolution + if key not in seen: + seen.add(key) + deduped.append(e) + return deduped[:cap] + + +# --- Media output dir --- +def _new_media_dir(): + import uuid + d = os.path.join(os.path.dirname(os.path.abspath(__file__)), "media_output", uuid.uuid4().hex[:8]) + os.makedirs(d, exist_ok=True) + return d + +def _plot_sweep(points, outdir): + """points: list of (E_laser_MJ, mean_yield_MJ, std_yield_MJ). Returns PNG path.""" + import matplotlib + matplotlib.use("Agg") + import matplotlib.pyplot as plt + xs = [p[0] for p in points] + ys = [p[1] for p in points] + es = [p[2] if len(p) > 2 else 0.0 for p in points] + fig, ax = plt.subplots(figsize=(7, 5)) + ax.errorbar(xs, ys, yerr=es, fmt="o-", color="crimson", ecolor="gray", + elinewidth=1.5, capsize=4, linewidth=2, markersize=7) + ax.set_xlabel("Laser Energy (MJ)") + ax.set_ylabel("Mean Fusion Yield (MJ)") + ax.set_title("Agent-Optimized Fusion Yield vs. Laser Energy\n(mean ± std over campaign rounds)") + ax.grid(True, alpha=0.4) + fig.tight_layout() + png = os.path.join(outdir, "yield_vs_laser.png") + fig.savefig(png, dpi=150) + plt.close(fig) + return png + + +# --- Gradio Blocks UI --- +# These are DESIGN ROUNDS (full PI -> Explorer -> PI -> Adversary -> PI cycles). run_campaign +# converts them into AutoGen's message-count budget. A campaign also stops early when the PI +# emits TERMINATE (yield converged), so these are ceilings, not fixed counts. Sweeps run one +# campaign per energy point, so their per-campaign round count is kept lower for runtime. +SWEEP_MAX_ROUNDS = 4 +SINGLE_MAX_ROUNDS = 10 +MEDIA_MAX_ROUNDS = 6 + +def _fallback_design(e_laser): + """A physically reasonable design at the given energy budget, used when an agent + campaign produces no simulation (keeps a sweep curve populated). Scales shell mass + to the budget at the reference velocity.""" + ke_budget = ETA_COUPLING * e_laser + v0 = -4.5e5 + M_sh = 2.0 * ke_budget / (v0 ** 2) + M_sh = max(5e-8, min(2e-6, M_sh)) + return {"R0": 1.5e-4, "v0": v0, "T0": 1.0, "M_sh": M_sh, "M_hs": 5e-9, + "delta": 0.04, "mode": 12.0, "roughness": 5e-7} + +# --- Analysis ("debrief") helpers --- +def _is_analysis_request(message): + """True if the message is a question ABOUT prior results rather than a request to RUN a + new campaign. Used only when stored campaign results already exist.""" + import re + m = message.lower().strip() + # Explicit "start a new run" verbs always win — these are NOT analysis. + run_kw = ["optimize", "simulate", "run a", "run the sim", "run another", + "design a", "new campaign", "make a movie"] + if any(k in m for k in run_kw + SWEEP_KEYWORDS + MEDIA_KEYWORDS): + return False + # A request naming a laser energy together with an action word is a run request. + has_energy = bool(re.search(r"[0-9.]+\s*(MJ|kJ)", message, re.IGNORECASE)) + if has_energy and any(k in m for k in ["optimize", "simulate", "run", "design", "capsule", "laser"]): + return False + analysis_kw = ["explain", "why", "analyze", "analyse", "analysis", "interpret", + "summar", "compare", "tell me", "what ", "what'", "which", "how ", + "describe", "discuss", "trade", "robust", "best design", "your thoughts", + "comment", "insight", "result", "happened", "did the"] + return m.endswith("?") or any(k in m for k in analysis_kw) + + +def _fmt_params(params): + return ", ".join(f"{k}={v:.3g}" for k, v in params.items()) + + +def _format_campaigns(state): + """Serialize every campaign run this session into a compact text block for the PI.""" + lines = [] + for i, c in enumerate(state.get("campaigns", []), 1): + lines.append(f"### Campaign {i}: {c['label']}") + lines.append(f"User request: {c['user_message']}") + ke = ETA_COUPLING * c["e_laser"] + lines.append(f"Laser energy: {c['e_laser']/1e6:.2f} MJ | KE budget: {ke:.0f} J ({ke/1e3:.1f} kJ)") + bp = c.get("best_params") + if bp: + lines.append(f"Best yield: {c.get('best_yield', 0):.3f} MJ") + lines.append(f"Best design: {_fmt_params(bp)}") + lines.append(f"Runs: {len(c.get('results', []))} | " + f"mean yield {c.get('mean_yield', 0):.3f} ± {c.get('std_yield', 0):.3f} MJ") + for params, y in c.get("results", []): + lines.append(f" - yield {y:.3f} MJ <- {_fmt_params(params)}") + if c.get("sweep_points"): + pts = "; ".join(f"({e:.2f} MJ -> {mu:.2f}±{sd:.2f} MJ)" for e, mu, sd in c["sweep_points"]) + lines.append(f"Sweep (laser -> mean±std yield): {pts}") + if c.get("media"): + lines.append(f"Rendered media: {c['media']}") + lines.append("") + return "\n".join(lines) if lines else "(no campaign results recorded yet)" + + +def analyze_results(state): + """Ask the conversational PI to answer state['chat'] (which ends with the user's question), + given the full campaign history as context. Multi-turn: prior Q&A is replayed.""" + context = _format_campaigns(state) + messages = [ + {"role": "user", + "content": f"Here are the completed campaign results for your analysis:\n\n{context}"}, + {"role": "assistant", + "content": "Understood — I have reviewed all campaign data. What would you like me to analyze?"}, + ] + messages += [{"role": m["role"], "content": m["content"]} for m in state.get("chat", [])] + try: + reply = pi_analyst.generate_reply(messages=messages) + except Exception as e: + return f"Analysis failed: {e}" + if isinstance(reply, dict): + reply = reply.get("content") + return reply or "(no response)" + + +def _record_campaign(state, label, user_message, e_laser, holder, sweep_points=None, media=None): + """Append one campaign's structured results to the session state.""" + state.setdefault("campaigns", []).append({ + "label": label, + "user_message": user_message, + "e_laser": e_laser, + "best_yield": holder.get("best_yield", 0.0), + "best_params": holder.get("best_params"), + "results": holder.get("results", []), + "yields": holder.get("yields", []), + "mean_yield": holder.get("mean_yield", 0.0), + "std_yield": holder.get("std_yield", 0.0), + "sweep_points": sweep_points, + "media": media, + }) + + +def handle_request(user_message, chat_history, state): + """Main entry point. Generator yielding (chatbot_messages, image, video). + + `state` is a session-scoped dict {"campaigns": [...], "chat": [...]} that is mutated in + place to persist results and the analysis conversation across turns. + """ + state.setdefault("campaigns", []) + state.setdefault("chat", []) + history = list(chat_history or []) + history.append({"role": "user", "content": user_message}) + + def _assistant(text): + return history + [{"role": "assistant", "content": text}] + + # --- Debrief routing: chat with the PI about results already collected --- + if _is_analysis_request(user_message): + if not state["campaigns"]: + yield _assistant( + "There are no campaign results to analyze yet. Ask me to optimize a capsule " + "(e.g. *'optimize a capsule for a 3 MJ laser'*) or run a sweep first, then I can " + "discuss what the runs showed."), gr.update(), gr.update() + return + state["chat"].append({"role": "user", "content": user_message}) + yield _assistant("_Principal_Investigator is reviewing the campaign results…_"), gr.update(), gr.update() + answer = analyze_results(state) + state["chat"].append({"role": "assistant", "content": answer}) + yield _assistant(answer), gr.update(), gr.update() + return + + mode = _detect_mode(user_message) + + if mode == "single": + e_laser = _parse_laser_energy(user_message) + holder = {} + for transcript in run_campaign(user_message, e_laser, SINGLE_MAX_ROUNDS, holder): + yield _assistant(transcript), gr.update(), gr.update() + _record_campaign(state, f"single @ {e_laser/1e6:.2f} MJ", user_message, e_laser, holder) + return + + if mode == "sweep": + energies = _sweep_energies(user_message) + n = len(energies) + lo, hi = energies[0], energies[-1] + log = (f"# Laser-Energy Sweep\n\nRunning **{n}** agent campaigns from " + f"**{lo/1e6:.2f} MJ** to **{hi/1e6:.2f} MJ** " + f"({SWEEP_MAX_ROUNDS} rounds each). This will take several minutes.\n") + yield _assistant(log), gr.update(), gr.update() + + points = [] + sweep_best = [] # (e_laser, best_params) per point, for the PI debrief + sweep_results = [] # flattened (params, yield) over the whole sweep + for i, e_laser in enumerate(energies): + log += f"\n### Point {i+1}/{n}: {e_laser/1e6:.2f} MJ laser\n" + yield _assistant(log), gr.update(), gr.update() + holder = {} + sub_msg = f"optimize an ICF capsule for a {e_laser/1e6:.2f} MJ laser" + last = "" + for transcript in run_campaign(sub_msg, e_laser, SWEEP_MAX_ROUNDS, holder): + last = transcript + yield _assistant(log + "\n" + last), gr.update(), gr.update() + if holder.get("best_params"): + sweep_best.append((e_laser, holder["best_params"])) + sweep_results.extend(holder.get("results", [])) + mean_y = holder.get("mean_yield", 0.0) + std_y = holder.get("std_yield", 0.0) + nsim = len(holder.get("results", [])) + note = "" + if not holder.get("results"): + # Agent campaign produced no simulation — fall back to a direct run so the + # sweep curve stays populated (no variance from a single point). + fb = _fallback_design(e_laser) + res = call_mcp_icf_server(**fb) + mean_y = _parse_yield_mj(res) or 0.0 + std_y = 0.0 + note = " _(fallback direct simulation)_" + points.append((e_laser / 1e6, mean_y, std_y)) + log += (f"\n**Point {i+1} result: mean yield = {mean_y:.2f} ± {std_y:.2f} MJ " + f"over {nsim} sims**{note}\n") + yield _assistant(log), gr.update(), gr.update() + + outdir = _new_media_dir() + png = _plot_sweep(points, outdir) + summary = "\n\n## Sweep Complete\n\n| Laser Energy (MJ) | Mean Yield (MJ) | Std (MJ) |\n|---|---|---|\n" + for e_mj, mean_y, std_y in points: + summary += f"| {e_mj:.2f} | {mean_y:.2f} | {std_y:.2f} |\n" + log += summary + + # Record the whole sweep as one campaign for the PI debrief. + best_y, best_p = 0.0, None + for params, y in sweep_results: + if y > best_y: + best_y, best_p = y, params + sweep_holder = { + "best_yield": best_y, "best_params": best_p, "results": sweep_results, + "yields": [y for _p, y in sweep_results], + "mean_yield": (sum(p[1] for p in points) / len(points)) if points else 0.0, + "std_yield": 0.0, + } + _record_campaign( + state, f"sweep {lo/1e6:.2f}-{hi/1e6:.2f} MJ ({n} pts)", + user_message, hi, sweep_holder, sweep_points=points) + + yield _assistant(log), gr.update(value=png), gr.update() + return + + if mode == "media": + e_laser = _parse_laser_energy(user_message) + log = (f"# Simulation Media\n\nRunning an agent campaign at {e_laser/1e6:.2f} MJ to find a " + f"design, then rendering its implosion movie and diagnostic plots.\n") + yield _assistant(log), gr.update(), gr.update() + + holder = {} + sub_msg = f"optimize an ICF capsule for a {e_laser/1e6:.2f} MJ laser" + for transcript in run_campaign(sub_msg, e_laser, MEDIA_MAX_ROUNDS, holder): + yield _assistant(log + "\n" + transcript), gr.update(), gr.update() + + best = holder.get("best_params") + if not best: + best = _fallback_design(e_laser) + holder["best_params"] = best # so the PI debrief reflects what was actually rendered + log += "\n\n_(agent campaign produced no simulation; rendering a fallback design)_\n" + yield _assistant(log), gr.update(), gr.update() + + log += (f"\n\n## Best design found (yield {holder.get('best_yield', 0):.2f} MJ)\n" + f"Rendering implosion movie and diagnostics...\n") + yield _assistant(log), gr.update(), gr.update() + + import icf_viz + outdir = _new_media_dir() + try: + png = icf_viz.render_diagnostics(best, outdir) + yield _assistant(log + "\n_Diagnostics ready, rendering movie..._"), gr.update(value=png), gr.update() + mp4 = icf_viz.render_implosion_movie(best, outdir) + log += "\n\n**Media rendering complete.**" + yield _assistant(log), gr.update(value=png), gr.update(value=mp4) + _record_campaign(state, f"media @ {e_laser/1e6:.2f} MJ", user_message, e_laser, + holder, media=f"diagnostics={png}, movie={mp4}") + except Exception as e: + log += f"\n\n**Media generation failed:** {e}" + yield _assistant(log), gr.update(), gr.update() + return + + +def build_ui(): + _here = os.path.dirname(os.path.abspath(__file__)) + # Prefer the white logo (legible on the dark background); fall back to the black one. + _logo_white = os.path.join(_here, "amd_logo_white.png") + _logo_black = os.path.join(_here, "amd_logo.png") + _logo = _logo_white if os.path.exists(_logo_white) else _logo_black + theme = gr.themes.Origin( + primary_hue="green", + neutral_hue="slate", + font=[gr.themes.GoogleFont("Inter"), "ui-sans-serif", "system-ui", "sans-serif"], ) + avatars = (None, _logo if os.path.exists(_logo) else None) + # Force dark mode as the default by adding the theme param on first load. + _force_dark = """ + function refresh() { + const url = new URL(window.location); + if (url.searchParams.get('__theme') !== 'dark') { + url.searchParams.set('__theme', 'dark'); + window.location.href = url.href; + } + } + """ + with gr.Blocks(title="Agentic RL Fusion Capsule Optimizer", theme=theme) as demo: + # Session-scoped store of all campaign results + the PI analysis conversation. + results_state = gr.State({"campaigns": [], "chat": []}) + if os.path.exists(_logo): + gr.Image(value=_logo, height=64, show_label=False, container=False, + interactive=False) + gr.Markdown("# Agentic RL Fusion Capsule Optimizer\n" + "Multi-agent system for robust fusion yield assessment. " + "Ask for a single point design (*'optimize a capsule for a 3 MJ laser energy'*), " + "a **sweep** (e.g. *'sweep yield vs laser energy " + "from 1 to 5 MJ with 6 points'*), or **media** " + "(e.g. *'show me a movie of the implosion'*). " + "After a run, **chat with the Principal Investigator** about the results " + "(e.g. *'why did the best design win?'*, *'how robust is it to defects?'*, " + "*'compare the 3 MJ and 5 MJ campaigns'*).") + with gr.Row(): + with gr.Column(scale=3): + chatbot = gr.Chatbot(height=600, label="Agent Conversation", + avatar_images=avatars, render_markdown=True) + with gr.Row(): + txt = gr.Textbox(placeholder="Message the fusion design swarm…", + scale=8, show_label=False, container=False, + lines=1, max_lines=6, autofocus=True) + submit = gr.Button("Send", variant="primary", scale=1, min_width=80) + with gr.Column(scale=2): + image = gr.Image(label="Plots", type="filepath") + video = gr.Video(label="Implosion Movie") + gr.Markdown( + "

" + ) + + def _submit(message, history, state): + state = state or {"campaigns": [], "chat": []} + for chatbot_msgs, img, vid in handle_request(message, history, state): + yield chatbot_msgs, img, vid, state + + submit.click(_submit, [txt, chatbot, results_state], + [chatbot, image, video, results_state]).then( + lambda: "", None, txt) + txt.submit(_submit, [txt, chatbot, results_state], + [chatbot, image, video, results_state]).then( + lambda: "", None, txt) + # Force dark mode as the default on page load. + demo.load(None, None, None, js=_force_dark) + return demo + + +if __name__ == "__main__": + demo = build_ui() demo.launch(server_name="0.0.0.0", server_port=7860, share=True) diff --git a/MLExamples/icf_4agent/create_aivenv.sh b/MLExamples/icf_4agent/create_aivenv.sh index 7d52d277..991bb946 100755 --- a/MLExamples/icf_4agent/create_aivenv.sh +++ b/MLExamples/icf_4agent/create_aivenv.sh @@ -3,7 +3,7 @@ set -e ROCMVERSION=7.2.2 -module load rocm/$ROCMVERSION +#module load rocm/$ROCMVERSION python3 -m venv aivenv --system-site-packages source aivenv/bin/activate diff --git a/MLExamples/icf_4agent/docs/summary.tex b/MLExamples/icf_4agent/docs/summary.tex index 967a6019..9a6974a7 100644 --- a/MLExamples/icf_4agent/docs/summary.tex +++ b/MLExamples/icf_4agent/docs/summary.tex @@ -160,7 +160,7 @@ \subsection{Energy Constraint} E_k = \frac{1}{2}M_{sh} v_0^2 = \eta \, E_{laser} \label{eq:energy_constraint} \end{equation} -For NIF-class indirect-drive implosions, $\eta \approx 0.015$ and $E_{laser} = 3$~MJ, giving a kinetic energy budget of $E_k = 45$~kJ. This constraint defines a one-dimensional manifold in $(M_{sh}, v_0)$ space: increasing shell mass requires decreasing implosion velocity, and vice versa. The fundamental tradeoff is between \textit{fuel inventory} (more mass to burn) and \textit{implosion vigor} (higher velocity for stronger compression and higher stagnation temperature). +For NIF-class indirect-drive implosions, $\eta \approx 0.015$; a $3$~MJ laser then gives a kinetic energy budget of $E_k = 45$~kJ. The laser energy is not fixed: it is parsed from the user's request and the corresponding budget is computed and supplied to the agents at the start of each campaign, so the same machinery scans the full range from sub-MJ to multi-MJ drives. This constraint defines a one-dimensional manifold in $(M_{sh}, v_0)$ space: increasing shell mass requires decreasing implosion velocity, and vice versa. The fundamental tradeoff is between \textit{fuel inventory} (more mass to burn) and \textit{implosion vigor} (higher velocity for stronger compression and higher stagnation temperature). \subsection{Defect Bounds} @@ -185,7 +185,7 @@ \subsection{Agent Roles and Communication} \begin{enumerate} \item \textbf{Principal Investigator (PI)}: The orchestrator agent, implemented on a frontier LLM. It coordinates the optimization campaign by sequentially engaging the Explorer and Adversary, validates the energy constraint (Eq.~\ref{eq:energy_constraint}), invokes the simulation tool, evaluates results against ignition criteria (yield $> 1$~MJ, stagnation pressure $> 100$~Gbar, RT amplification $< 1000\times$), and decides whether to iterate or terminate. The PI is the \textit{only} agent authorized to call the simulation tool. - \item \textbf{Design Explorer}: Proposes capsule design parameters $\mathbf{x}$ to maximize yield. In production, this agent runs on a domain-specific LLM fine-tuned on ICF literature, enabling physics-informed design intuition beyond what is available from general-purpose models. It receives feedback from prior simulation results and adjusts parameters along the constant-energy manifold. + \item \textbf{Design Explorer}: Proposes capsule design parameters $\mathbf{x}$ to maximize yield. This agent is intended to run on a domain-specific LLM fine-tuned on high-energy-density-physics literature, enabling physics-informed design intuition beyond what is available from general-purpose models. In the local deployment described in Section~\ref{sec:deployment}, all agents are served by such a model (\texttt{gptoss-20b-hedp}, a 20B-parameter open-weight model fine-tuned on HEDP papers). It receives feedback from prior simulation results and adjusts parameters along the constant-energy manifold. \item \textbf{Defect Adversary}: Proposes manufacturing defect parameters $\mathbf{d}$ to stress-test the Explorer's designs. It follows a systematic strategy: probing individual defect modes in early rounds to identify the design's primary sensitivity, then combining the most damaging perturbations in later rounds. @@ -266,9 +266,38 @@ \subsection{MCP Tool Server} \label{fig:architecture} \end{figure} -\subsection{Streaming Interface} +\subsection{Deployment and Backends} +\label{sec:deployment} -The agent swarm is served through a Gradio web interface that provides real-time visibility into the multi-agent conversation. The AutoGen group chat runs in a background thread while a generator function polls the shared message list, yielding each agent's contribution to the browser as it is produced. This streaming architecture allows users to monitor the optimization in real time, observing the Explorer's design rationale, the Adversary's perturbation strategy, and the PI's evaluation of each simulation result. +The system supports two interchangeable LLM backends, selected at launch. The first is a frontier cloud model accessed through a hosted API, in which the PI invokes the simulation through the framework's native tool-calling interface. The second is a fully local deployment in which an open-weight model fine-tuned on HEDP literature (\texttt{gptoss-20b-hedp}, 20B parameters) is served through a high-throughput inference engine (vLLM) on AMD Instinct GPUs, exposing an OpenAI-compatible endpoint. The local deployment is significant for security-sensitive design work, where sending capsule parameters to an external service is undesirable: the entire reasoning--simulation loop runs on-premises. + +\subsection{Robustness Layer for Open-Weight Models} + +Small open-weight models are markedly less reliable than frontier models at the structured behaviors the orchestration depends on. Four mechanisms make the local deployment robust: + +\begin{enumerate} + \item \textbf{Text-based tool invocation.} Rather than relying on a structured tool-call API, the PI emits a plain-text directive (\texttt{RUN\_SIMULATION: R0=..., v0=..., ...}) that a parser intercepts, validates, executes against the MCP server, and replaces with the returned metrics. A markdown-tolerant regular expression handles the formatting variability typical of these models. This sidesteps the brittle and architecture-specific structured-output tokens that otherwise cause server-side parse failures. + \item \textbf{Deterministic speaker scheduling.} Speaker selection follows a fixed cycle (PI $\rightarrow$ Explorer $\rightarrow$ PI $\rightarrow$ Adversary $\rightarrow$ PI) rather than an LLM-driven selector, eliminating the malformed-selection errors and degenerate loops that small models produce when asked to choose the next speaker. + \item \textbf{Response sanitization.} A wrapper on the model client strips stray tool-call artifacts and substitutes empty strings for null content before any downstream processing, preventing exceptions from non-conforming responses. + \item \textbf{Bounded context.} A history-trimming hook caps what each agent sees to the campaign's opening message (which carries the energy budget) plus the most recent exchanges, so a long campaign cannot overflow the model's context window. +\end{enumerate} + +\subsection{Operational Modes and Interface} + +The agent swarm is served through a Gradio web interface that provides real-time visibility into the multi-agent conversation. The group chat runs in a background thread while a generator polls the shared message list, streaming each agent's contribution to the browser as it is produced---the Explorer's design rationale, the Adversary's perturbation strategy, and the PI's evaluation of each simulation. A user request is routed by intent into one of four modes: + +\begin{itemize} + \item \textbf{Single design campaign:} one optimization campaign at a requested laser energy, streamed live. + \item \textbf{Laser-energy sweep:} one full campaign per energy point, producing a plot of fusion yield versus laser energy. Each point reports the \emph{mean} yield over the campaign's simulations with $\pm 1\sigma$ error bars; the variance is itself a diagnostic, growing where the design space straddles the ignition threshold (Section~\ref{sec:results}). The energy grid is parsed from natural language and supports multiple range segments with independent step sizes (e.g.\ fine spacing across the ignition cliff and coarse spacing across the high-yield plateau). + \item \textbf{Simulation media:} the best design from a campaign is rendered as an animation of the imploding density field and as diagnostic time-history traces. + \item \textbf{Interactive analysis (debrief):} once at least one campaign has run, the user can pose natural-language questions about the results---\textit{why} a design won, \textit{how} robust it is to defects, or \textit{which} parameter dominated---and receive a written analysis rather than a new simulation. +\end{itemize} + +Each campaign is bounded by a maximum number of agent rounds and a yield-plateau stopping criterion (Section~\ref{sec:agents} prompt protocol). When a campaign yields no valid simulation, a physically reasonable fallback design at the target energy keeps the sweep and media outputs populated. + +\subsection{Conversational Debrief of Campaign Results} + +The first three modes are generative---they spend simulation budget to produce new designs. The fourth is interpretive. Every campaign's structured outcome (the best design and its yield, every sampled design with its eight parameters and resulting yield, the mean/$\sigma$ statistics, any sweep curve, and rendered-media references) is retained in a session-scoped store that persists across conversational turns. When the user's message is a question about prior results rather than a request to run something, an intent router dispatches it to a dedicated \emph{conversational PI} agent: the same frontier LLM as the orchestrating PI but operating from a debrief prompt with no simulation tool and no authority to alter the design. It is supplied the serialized result store as context and answers strictly from that data, declining and suggesting a follow-up campaign when the necessary information is absent. The exchange carries multi-turn memory, so follow-up questions retain context. The router separates the two intents with a keyword heuristic: explicit run verbs (\texttt{optimize}, \texttt{sweep}, \texttt{render a movie}) and energy-bearing requests start a campaign, while interrogatives and analysis verbs (\texttt{why}, \texttt{how}, \texttt{compare}, \texttt{explain}, \texttt{robust}) route to the debrief agent. This converts the system from a fire-and-forget optimizer into an interactive design assistant, with the human able to interrogate the rationale behind a result without re-running the swarm. %============================================================================= \section{Results} @@ -435,6 +464,7 @@ \section{Conclusions} \item An adversarial min-max optimization formulation (Eq.~\ref{eq:minmax}) that discovers designs robust to mode-1 asymmetry, RT instability, and surface roughness within NIF-class manufacturing tolerances. \item A 4-agent architecture with constrained speaker transitions and server-enforced parameter bounds, addressing practical challenges of LLM-driven optimization (unit confusion, role drift, out-of-bounds proposals). \item Demonstration of autonomous convergence: agents navigate the $(M_{sh}, v_0)$ manifold over six rounds, improving yield from 7.4~MJ to 11.3~MJ (53\% gain) while maintaining robustness to $\delta \leq 0.012$ asymmetry, with yield-plateau stopping criteria terminating the campaign automatically. + \item An interactive debrief mode in which a tool-free conversational instance of the PI reasons over a persistent, session-scoped store of campaign results, allowing the human to interrogate the rationale and robustness of any completed design without re-running the swarm. \end{enumerate} The MCP-based decoupling of reasoning agents from physics execution provides a natural pathway to scaling this approach to high-fidelity radiation hydrodynamics simulations on HPC clusters, transforming the human-in-the-loop design bottleneck into an automated, adversarially robust optimization cycle. diff --git a/MLExamples/icf_4agent/icf_core.py b/MLExamples/icf_4agent/icf_core.py index e6a424f9..260f9c64 100644 --- a/MLExamples/icf_4agent/icf_core.py +++ b/MLExamples/icf_4agent/icf_core.py @@ -163,6 +163,75 @@ def plot_time_histories(sol, M1, M2, output_dir="implosion_frames"): plt.savefig(f"{output_dir}/time_histories.png", dpi=300, bbox_inches='tight') plt.close() +def solve_implosion(R0, v0, T0, M_sh, M_hs, delta, mode, roughness): + """Integrate the deceleration-phase ODE system for a given capsule design. + + Returns (sol, M1, M2): the solve_ivp solution object and the two piston masses. + All inputs are in SI units except T0 which is in keV. + """ + M1 = (M_sh / 2.0) * (1.0 + delta) + M2 = (M_sh / 2.0) * (1.0 - delta) + + V0 = (4.0 / 3.0) * np.pi * R0**3 + P_hs0 = 2.0 * (M_hs / V0 / M_DT) * k * (T0 * 1.16045e7) + E_hs0 = 1.5 * P_hs0 * V0 + + y0 = [R0, v0, R0, v0, E_hs0, 0.0, 0.0, M_hs, M_hs] + + t_span = (0, 0.6e-9) + t_eval = np.linspace(0, 0.6e-9, 200) + + # Safely back on Radau. No custom tolerance arrays to trip it up. + sol = solve_ivp(asymmetric_odes, t_span, y0, t_eval=t_eval, method='Radau', + args=(M1, M2, mode), rtol=1e-6, atol=1e-8, max_step=1e-12) + + return sol, M1, M2 + + +def compute_metrics(sol, M1, M2, M_hs, mode): + """Compute stagnation metrics from an integrated solution. Returns a dict.""" + R_eff_array = (sol.y[0] + sol.y[2]) / 2.0 + stag_idx = np.argmin(R_eff_array) + + R1_stag = sol.y[0][stag_idx] + R2_stag = sol.y[2][stag_idx] + v1_stag = sol.y[1][stag_idx] + v2_stag = sol.y[3][stag_idx] + + RKE = 0.5 * M1 * v1_stag**2 + 0.5 * M2 * v2_stag**2 + + E_hs_stag = sol.y[4][stag_idx] + V_stag = (4.0 / 3.0) * np.pi * ((R1_stag + R2_stag) / 2.0)**3 + P_stag = (2.0 / 3.0) * E_hs_stag / V_stag + + rt_exponent = sol.y[6][stag_idx] + rt_amplification = np.exp(rt_exponent) + + # Force diagnostic yield to non-negative just in case + final_yield_MJ = max(0.0, sol.y[5][-1] / 1e6) + + initial_fuel_ug = M_hs * 1e9 + final_fuel_ug = max(0.0, sol.y[7][-1] * 1e9) + total_ablated_mass_ug = max(0.0, (sol.y[8][-1] - M_hs) * 1e9) + + total_pool = initial_fuel_ug + total_ablated_mass_ug + burned_fraction = ((total_pool - final_fuel_ug) / total_pool * 100.0) if total_pool > 0 else 0.0 + + return { + "stag_idx": stag_idx, + "R1_stag": R1_stag, + "R2_stag": R2_stag, + "P_stag_Gbar": P_stag / 1e14, + "yield_MJ": final_yield_MJ, + "ablated_ug": total_ablated_mass_ug, + "burn_fraction": burned_fraction, + "total_pool_ug": total_pool, + "RKE_J": RKE, + "rt_amplification": rt_amplification, + "mode": mode, + } + + def main(): parser = argparse.ArgumentParser(description="2D Asymmetric Piston Surrogate") parser.add_argument('--R0', type=float, default=150e-6) @@ -174,80 +243,44 @@ def main(): parser.add_argument('--mode', type=float, default=10.0) parser.add_argument('--roughness', type=float, default=0.1e-6) parser.add_argument('--plot', action='store_true') - + args = parser.parse_args() - - M1 = (args.M_sh / 2.0) * (1.0 + args.delta) - M2 = (args.M_sh / 2.0) * (1.0 - args.delta) - - V0 = (4.0 / 3.0) * np.pi * args.R0**3 - P_hs0 = 2.0 * (args.M_hs / V0 / M_DT) * k * (args.T0 * 1.16045e7) - E_hs0 = 1.5 * P_hs0 * V0 - - y0 = [args.R0, args.v0, args.R0, args.v0, E_hs0, 0.0, 0.0, args.M_hs, args.M_hs] - - t_span = (0, 0.6e-9) - t_eval = np.linspace(0, 0.6e-9, 200) - + print(f"Simulating implosion (Delta = {args.delta}, Mode = {args.mode})...") - - # Safely back on Radau. No custom tolerance arrays to trip it up. - sol = solve_ivp(asymmetric_odes, t_span, y0, t_eval=t_eval, method='Radau', - args=(M1, M2, args.mode), rtol=1e-6, atol=1e-8, max_step=1e-12) - - if len(sol.t) < len(t_eval): + + sol, M1, M2 = solve_implosion(args.R0, args.v0, args.T0, args.M_sh, args.M_hs, + args.delta, args.mode, args.roughness) + + t_eval_len = 200 + if len(sol.t) < t_eval_len: print(f"Warning: ODE solver stopped early at step {len(sol.t)}.") - - R_eff_array = (sol.y[0] + sol.y[2]) / 2.0 - stag_idx = np.argmin(R_eff_array) - + + m = compute_metrics(sol, M1, M2, args.M_hs, args.mode) + stag_idx = m["stag_idx"] + if args.plot: print("Generating high-resolution PNGs and time-history traces...") output_dir = "implosion_frames" plot_time_histories(sol, M1, M2, output_dir=output_dir) - + end_idx = min(stag_idx + 20, len(sol.t)) - for i in range(0, end_idx, 2): + for i in range(0, end_idx, 2): plot_synthetic_density( - sol.y[0][i], sol.y[2][i], sol.y[6][i], sol.t[i], i, + sol.y[0][i], sol.y[2][i], sol.y[6][i], sol.t[i], i, args.mode, args.roughness, output_dir=output_dir ) print(f"Saved visualization files to the '{output_dir}/' directory.") - - R1_stag = sol.y[0][stag_idx] - R2_stag = sol.y[2][stag_idx] - v1_stag = sol.y[1][stag_idx] - v2_stag = sol.y[3][stag_idx] - - RKE = 0.5 * M1 * v1_stag**2 + 0.5 * M2 * v2_stag**2 - - E_hs_stag = sol.y[4][stag_idx] - V_stag = (4.0 / 3.0) * np.pi * ((R1_stag + R2_stag)/2.0)**3 - P_stag = (2.0 / 3.0) * E_hs_stag / V_stag - - rt_exponent = sol.y[6][stag_idx] - rt_amplification = np.exp(rt_exponent) - - # Force diagnostic yield to non-negative just in case - final_yield_MJ = max(0.0, sol.y[5][-1] / 1e6) - - initial_fuel_ug = args.M_hs * 1e9 - final_fuel_ug = max(0.0, sol.y[7][-1] * 1e9) - total_ablated_mass_ug = max(0.0, (sol.y[8][-1] - args.M_hs) * 1e9) - - total_pool = initial_fuel_ug + total_ablated_mass_ug - burned_fraction = ((total_pool - final_fuel_ug) / total_pool * 100.0) if total_pool > 0 else 0.0 - + print(f"\n--- Asymmetric Mode-1 Metrics (Delta = {args.delta}) ---") - print(f"Stagnation Radius (Left): {R1_stag*1e6:.2f} um") - print(f"Stagnation Radius (Right): {R2_stag*1e6:.2f} um") - print(f"Stagnation Pressure: {P_stag / 1e14:.2f} Gbar") - print(f"Total Fusion Yield: {final_yield_MJ:.3f} MJ") - print(f"Ablated Mass Injected: {total_ablated_mass_ug:.2f} ug") - print(f"Fuel Burn Fraction: {burned_fraction:.2f}% (Total Pool: {total_pool:.2f} ug)") - print(f"Residual Kinetic Energy: {RKE:.2f} Joules") - print(f"RT Amplification (l={args.mode}): {rt_amplification:.2f}x initial perturbation") + print(f"Stagnation Radius (Left): {m['R1_stag']*1e6:.2f} um") + print(f"Stagnation Radius (Right): {m['R2_stag']*1e6:.2f} um") + print(f"Stagnation Pressure: {m['P_stag_Gbar']:.2f} Gbar") + print(f"Total Fusion Yield: {m['yield_MJ']:.3f} MJ") + print(f"Ablated Mass Injected: {m['ablated_ug']:.2f} ug") + print(f"Fuel Burn Fraction: {m['burn_fraction']:.2f}% (Total Pool: {m['total_pool_ug']:.2f} ug)") + print(f"Residual Kinetic Energy: {m['RKE_J']:.2f} Joules") + print(f"RT Amplification (l={args.mode}): {m['rt_amplification']:.2f}x initial perturbation") + if __name__ == "__main__": main() - diff --git a/MLExamples/icf_4agent/icf_viz.py b/MLExamples/icf_4agent/icf_viz.py new file mode 100644 index 00000000..129ac519 --- /dev/null +++ b/MLExamples/icf_4agent/icf_viz.py @@ -0,0 +1,108 @@ +"""Media generation for the ICF surrogate: implosion movies and diagnostic plots. + +Uses the programmatic API in icf_core (solve_implosion / plot_time_histories) to render +an animation of the density field and the time-history diagnostic traces. Designed to run +headless (Agg backend) and to produce a fixed-size MP4 via ffmpeg. +""" +import os +import shutil + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from matplotlib.animation import FuncAnimation, FFMpegWriter +import numpy as np + +import icf_core + +# Point matplotlib at whatever ffmpeg is on PATH (e.g. ~/bin/ffmpeg). +_ffmpeg = shutil.which("ffmpeg") +if _ffmpeg: + plt.rcParams["animation.ffmpeg_path"] = _ffmpeg + + +def render_implosion_movie(params, outdir, fps=12): + """Render an MP4 animation of the density field through stagnation. + + params: dict with keys R0, v0, T0, M_sh, M_hs, delta, mode, roughness (SI; T0 in keV). + Returns the path to the written MP4. + """ + os.makedirs(outdir, exist_ok=True) + sol, M1, M2 = icf_core.solve_implosion( + params["R0"], params["v0"], params["T0"], params["M_sh"], params["M_hs"], + params["delta"], params["mode"], params["roughness"], + ) + + mode = params["mode"] + roughness = params["roughness"] + + # Animate from start through ~20 steps past stagnation + R_eff_array = (sol.y[0] + sol.y[2]) / 2.0 + stag_idx = int(np.argmin(R_eff_array)) + end_idx = min(stag_idx + 20, len(sol.t)) + frame_indices = list(range(0, end_idx, 2)) + if not frame_indices: + frame_indices = [0] + + # Fixed canvas so every frame is identical in size (required for a valid MP4). + grid_size = 400 + L = 200e-6 + x = np.linspace(-L, L, grid_size) + y = np.linspace(-L, L, grid_size) + X, Y = np.meshgrid(x, y) + distance = np.sqrt(X**2 + Y**2) + angles = np.arctan2(Y, X) + shell_thickness = 15e-6 + + fig, ax = plt.subplots(figsize=(6, 6)) + + def _density_map(R1, R2, rt_exponent): + R_theta = np.where(X < 0, R1, R2) + rt_amp = roughness * np.exp(rt_exponent) + R_perturbed = R_theta + rt_amp * np.cos(mode * angles) + dmap = np.zeros_like(X) + shell_mask = (distance > R_perturbed) & (distance < R_perturbed + shell_thickness) + hotspot_mask = distance <= R_perturbed + dmap[shell_mask] = 100.0 + dmap[hotspot_mask] = 10.0 + return dmap + + dmap0 = _density_map(sol.y[0][0], sol.y[2][0], sol.y[6][0]) + quad = ax.pcolormesh(X * 1e6, Y * 1e6, dmap0, cmap="magma", + shading="nearest", vmin=0, vmax=100) + ax.set_xlabel("X (um)") + ax.set_ylabel("Y (um)") + ax.set_xlim(-200, 200) + ax.set_ylim(-200, 200) + title = ax.set_title("") + + def _update(frame_no): + i = frame_indices[frame_no] + R1 = sol.y[0][i] + R2 = sol.y[2][i] + dmap = _density_map(R1, R2, sol.y[6][i]) + quad.set_array(dmap.ravel()) + delta = abs(R1 - R2) / (R1 + R2) if (R1 + R2) > 0 else 0.0 + title.set_text(f"t = {sol.t[i]*1e9:.3f} ns (Delta={delta:.2f}, l={mode:.0f})") + return quad, title + + anim = FuncAnimation(fig, _update, frames=len(frame_indices), blit=False) + mp4_path = os.path.join(outdir, "implosion.mp4") + writer = FFMpegWriter(fps=fps, metadata={"title": "ICF implosion"}, bitrate=2400) + anim.save(mp4_path, writer=writer, dpi=120) + plt.close(fig) + return mp4_path + + +def render_diagnostics(params, outdir): + """Render the time-history diagnostic traces (radius, areal density, temperature). + + Returns the path to the written PNG. + """ + os.makedirs(outdir, exist_ok=True) + sol, M1, M2 = icf_core.solve_implosion( + params["R0"], params["v0"], params["T0"], params["M_sh"], params["M_hs"], + params["delta"], params["mode"], params["roughness"], + ) + icf_core.plot_time_histories(sol, M1, M2, output_dir=outdir) + return os.path.join(outdir, "time_histories.png") diff --git a/MLExamples/icf_4agent/start_vllm.sh b/MLExamples/icf_4agent/start_vllm.sh index 6b2cb6c6..a3e482bb 100755 --- a/MLExamples/icf_4agent/start_vllm.sh +++ b/MLExamples/icf_4agent/start_vllm.sh @@ -3,16 +3,12 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" CHAT_TEMPLATE="${ICF_VLLM_CHAT_TEMPLATE:-${SCRIPT_DIR}/chatml_simple.jinja}" -MODEL_PATH="${ICF_VLLM_MODEL_PATH:-/shareddata/TPC26/gptoss-20b-hedp.03302026}" +MODEL_PATH="${ICF_VLLM_MODEL_PATH:-/home/jbelof/hfmodels/gptoss-20b-hedp.03302026}" MODEL_NAME="${ICF_VLLM_MODEL_NAME:-gptoss-20b-hedp}" -VLLM_IMAGE_TAR="${ICF_VLLM_IMAGE_TAR:-/shareddata/TPC26/vllm_rocm_nightly_main_20260531.tar}" +VLLM_IMAGE_TAR="${ICF_VLLM_IMAGE_TAR:-/home/jbelof/vllm_rocm_nightly_main_20260531.tar}" VLLM_PORT="${ICF_VLLM_PORT:-8000}" -# XXX JB -#TP_SIZE="${ICF_VLLM_TP_SIZE:-1}" -TP_SIZE="${ICF_VLLM_TP_SIZE:-2}" -# MI355X -#MAX_MODEL_LEN="${ICF_VLLM_MAX_MODEL_LEN:-16384}" -MAX_MODEL_LEN="${ICF_VLLM_MAX_MODEL_LEN:-8192}" +TP_SIZE="${ICF_VLLM_TP_SIZE:-1}" +MAX_MODEL_LEN="${ICF_VLLM_MAX_MODEL_LEN:-16384}" CONTAINER_RT="podman" if ! command -v podman &>/dev/null; then @@ -72,7 +68,6 @@ exec $CONTAINER_RT $PODMAN_FLAGS run --rm \ --served-model-name "$MODEL_NAME" \ --tensor-parallel-size "$TP_SIZE" \ --max-model-len "$MAX_MODEL_LEN" \ - --gpu-memory-utilization=0.7 \ --trust-remote-code \ --chat-template /app/chat_template.jinja \ --tool-call-parser none \ From 390aa87fb03c1fc4a48255ca55f322d4a779ddd4 Mon Sep 17 00:00:00 2001 From: Jon Belof Date: Thu, 11 Jun 2026 14:43:41 +0000 Subject: [PATCH 3/5] icf_4agent: rebuild summary.pdf from updated summary.tex Regenerate the manuscript PDF (via tectonic) so it reflects the documentation updates from the previous commit: the conversational-PI debrief subsection, the four-operational-modes description, and the added conclusions item. The PDF was previously stale relative to summary.tex. Co-Authored-By: Claude Opus 4.8 (1M context) --- MLExamples/icf_4agent/docs/summary.pdf | Bin 274343 -> 114776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/MLExamples/icf_4agent/docs/summary.pdf b/MLExamples/icf_4agent/docs/summary.pdf index 022841515ec62f801531bd64cb050bc285b77c98..b5ec98f67ebdf5eeb2b5a5371eb945ab99bc804a 100644 GIT binary patch literal 114776 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§ol_BuL>hb3^{LybCCo4SUZ??O<8 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 z�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

=>q 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 QY)o7%uoM*HiW0E@0|#9nxc~qF literal 274343 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 TowA)(&LG3-&N3L>YH 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℘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

jdwCX0;L0g@PO<}(EIzeE>mq!vEX9YWM48tnzIF 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 From b4f12adfd08957ed90053d0efd4bd9090e6ae04b Mon Sep 17 00:00:00 2001 From: "Dr. Jon Belof" Date: Sat, 13 Jun 2026 13:53:20 -0700 Subject: [PATCH 4/5] Revise diagram in README for clarity Updated the diagram in the README to reflect changes in the structure. --- MLExamples/icf_4agent/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MLExamples/icf_4agent/README.md b/MLExamples/icf_4agent/README.md index 36f04ae7..86a37f31 100644 --- a/MLExamples/icf_4agent/README.md +++ b/MLExamples/icf_4agent/README.md @@ -11,12 +11,12 @@ A multi-agent system that autonomously optimizes Inertial Confinement Fusion (IC │ ┌───────────────────────────────────┐ │ │ │ Principal Investigator (PI) │ │ │ │ Orchestrator / Evaluator │ │ -│ └──────┬────────────────┬──────────┘ │ +│ └──────┬────────────────┬──────────┘ │ │ │ │ │ -│ ┌──────▼──────┐ ┌─────▼────────┐ │ -│ │ Design │ │ Defect │ │ -│ │ Explorer │ │ Adversary │ │ -│ └─────────────┘ └──────────────┘ │ +│ ┌──────▼──────┐ ┌─────▼────────┐ │ +│ │ Design │ │ Defect │ │ +│ │ Explorer │ │ Adversary │ │ +│ └─────────────┘ └──────────────┘ │ │ │ │ │ ┌──────▼──────┐ │ │ │ User Proxy │ ◄── tool execution only │ From 9c32b0d1f870d698e5c5c9e86265627f1baa2eed Mon Sep 17 00:00:00 2001 From: "Dr. Jon Belof" Date: Sat, 13 Jun 2026 13:53:55 -0700 Subject: [PATCH 5/5] Fix formatting issues in README.md --- MLExamples/icf_4agent/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MLExamples/icf_4agent/README.md b/MLExamples/icf_4agent/README.md index 86a37f31..52bdce67 100644 --- a/MLExamples/icf_4agent/README.md +++ b/MLExamples/icf_4agent/README.md @@ -11,9 +11,9 @@ A multi-agent system that autonomously optimizes Inertial Confinement Fusion (IC │ ┌───────────────────────────────────┐ │ │ │ Principal Investigator (PI) │ │ │ │ Orchestrator / Evaluator │ │ -│ └──────┬────────────────┬──────────┘ │ +│ └──────┬────────────────┬───────-───┘ │ │ │ │ │ -│ ┌──────▼──────┐ ┌─────▼────────┐ │ +│ ┌──────▼──────┐ ┌────-─▼───────┐ │ │ │ Design │ │ Defect │ │ │ │ Explorer │ │ Adversary │ │ │ └─────────────┘ └──────────────┘ │