From b4b9bce424b64b1e41eda8261b3209f3f55fa438 Mon Sep 17 00:00:00 2001 From: pelesh Date: Wed, 7 Oct 2026 18:08:41 -0400 Subject: [PATCH] Prep for release 2.1 --- CHANGELOG.md | 15 +++++++++ CMakeLists.txt | 2 +- README.md | 9 ++---- agentigrid/agentigrid/engine/agent_loop.py | 4 +-- agentigrid/agentigrid_architecture.md | 3 +- agentigrid/claude_code_changes.md | 6 ++-- agentigrid/launcher/ARCHITECTURE.md | 2 +- agentigrid/setup.py | 2 +- docs/AgentiGrid_modification_plan.md | 2 +- docs/manual/ExaGO_Manual.pdf | Bin 575097 -> 575288 bytes docs/manual/main.tex | 2 +- ipopt_ref.opt | 36 --------------------- 12 files changed, 29 insertions(+), 54 deletions(-) delete mode 100644 ipopt_ref.opt diff --git a/CHANGELOG.md b/CHANGELOG.md index 715df35d..707b2117 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [develop] +## [2.1] + +### General +- Fixed bug with strings in PETSc allocated strctures (#61) +- Update dependencies to PETSc >=3.25 and ROCm >= 6.4 (#70) + +### User Interface +- Add AgentiGrid experimental agentic AI user interface (#65) +- Refactored visualizer (#69) + +### TCOPFLOW +- Fix ramp parsing and GENRAMP indexing in TCOPFLOW (#62) +- Improve preallocation of sparse matrices in TCOPFLOW (#71) + + ## [2.0] ### General diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d014994..8bfaa588 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ Preamble cmake_minimum_required(VERSION 3.18) -project(ExaGO VERSION "2.0.0") +project(ExaGO VERSION "2.1.0") set(CMAKE_CXX_STANDARD 17) set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") diff --git a/README.md b/README.md index 63b20513..81025455 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,8 @@ Additionally, note that SCOPFLOW and SOPFLOW with HiOp solver use Ipopt to solve Detailed installation instructions are given at [INSTALL.md](./INSTALL.md) for information on acquiring, building and installing ExaGO. -If you are a developer with access to the project, we also provide public binaries that are generated through our GitHub actions workflows documented in [README.md](.github/workflows/README.md), and with documentation about usage in the packages section of our repository. Check out a short (< 60s) demo of pulling down a version of ExaGO: +If you are a developer with access to the project, we also provide public binaries that are generated through our GitHub actions workflows documented in [README.md](.github/workflows/README.md), and with documentation about usage in the packages section of our repository. -[![asciicast]( -https://asciinema.org/a/KCi5TmUXc6zWDj7JYHzfSFxmw.png)]( -https://asciinema.org/a/KCi5TmUXc6zWDj7JYHzfSFxmw) ## Developer Guide @@ -111,8 +108,8 @@ the guidelines are ambiguous or you have a particular question. ## Authors ExaGOTM was designed and implemented by Shrirang Abhyankar and has received significant contributions from Slaven Peles, Nicholson Koukpaizan, -Maksudul Alam, Asher Mancinelli, Cameron Rutherford, Joshua Hambrick, Philip -Fackler, Eve Tsybina, Bruce Palmer, Jaelyn Litzinger, William Perkins, Sayef +Samim Konjicija, Maksudul Alam, Asher Mancinelli, Cameron Rutherford, Joshua Hambrick, Philip +Fackler, Eve Tsybina, Shaked Regev, Bruce Palmer, Jaelyn Litzinger, William Perkins, Sayef Azad Sakin, Joseph Macam, and Ryan Danehy. ## Acknowledgement diff --git a/agentigrid/agentigrid/engine/agent_loop.py b/agentigrid/agentigrid/engine/agent_loop.py index 23dae310..f32bb69b 100644 --- a/agentigrid/agentigrid/engine/agent_loop.py +++ b/agentigrid/agentigrid/engine/agent_loop.py @@ -916,7 +916,7 @@ def _build_extra_args(self) -> list[str] | None: return args if args else None def _normalize_sopflow_wind_base(self) -> None: - """REVIEW (Slaven sign-off): model base-case wind as curtailable for SOPFLOW. + """REVIEW: model base-case wind as curtailable for SOPFLOW. case_ACTIVSg200 ships wind generators as must-run (Pmin = Pmax = nameplate), so any scenario whose wind availability is below nameplate is infeasible in @@ -1000,7 +1000,7 @@ def run(self, base_case: Path, goal: str) -> SearchSession: logger.info("Parsing base case: %s", base_case) self._base_network = parse_matpower(base_case) self._current_network = self._base_network - # REVIEW (Slaven sign-off): model base-case wind as curtailable for SOPFLOW + # REVIEW: model base-case wind as curtailable for SOPFLOW # so scenarios with sub-nameplate wind are feasible (see the method + the # search.sopflow_curtailable_wind_base flag). No-op for non-SOPFLOW / disabled. self._normalize_sopflow_wind_base() diff --git a/agentigrid/agentigrid_architecture.md b/agentigrid/agentigrid_architecture.md index 17af9f60..f12138ac 100644 --- a/agentigrid/agentigrid_architecture.md +++ b/agentigrid/agentigrid_architecture.md @@ -7,8 +7,7 @@ | Project | AgentiGrid (in process of integration into ExaGO) | | Version | 0.3 — PFLOW Direct Optimization | | Date | May 2026 | -| Author | Samim K., University of Sarajevo | -| Supervisor | Slaven P., Oak Ridge National Laboratory | +| Author | Samim Konjicija, University of Sarajevo | | Target Platform | Linux (OpenSUSE Leap 15.6), Python 3.10+ | --- diff --git a/agentigrid/claude_code_changes.md b/agentigrid/claude_code_changes.md index 5c83fa3a..83a815a8 100644 --- a/agentigrid/claude_code_changes.md +++ b/agentigrid/claude_code_changes.md @@ -32,7 +32,7 @@ Confirmed `_augment_generator_mutation` already pins `Qmin == Qmax` (forced, not Prompt 13 re-ran an identical sweep 3× (50,504 tokens), prompt 17 2×. - `agentigrid/prompts/system_prompt.py`: explicit rule "DO NOT RE-RUN AN IDENTICAL SWEEP". -- `agentigrid/engine/agent_loop.py` (deterministic backstop): session-level `_sweep_signature_cache` keyed by `_sweep_cache_key(data)` (mode + entity + mutation + candidate_set + feasibility + metric + predicate + dispatchable/cost params; excludes description/reasoning). An identical re-request is served via `_serve_cached_sweep` (journaled "cached — not re-solved", no re-solve); changed parameters → different signature → still executes. Soft guard, never blocks a changed sweep. **Decision flagged for Slaven:** nudge-only vs. nudge + cache (both implemented here). +- `agentigrid/engine/agent_loop.py` (deterministic backstop): session-level `_sweep_signature_cache` keyed by `_sweep_cache_key(data)` (mode + entity + mutation + candidate_set + feasibility + metric + predicate + dispatchable/cost params; excludes description/reasoning). An identical re-request is served via `_serve_cached_sweep` (journaled "cached — not re-solved", no re-solve); changed parameters → different signature → still executes. Soft guard, never blocks a changed sweep. **Decision flagged for further discussion:** nudge-only vs. nudge + cache (both implemented here). ### Tests — `tests/test_sweep_corrections.py` (15) @@ -123,7 +123,7 @@ A **named registry of verified primitives** (Phase 1; not free-form LLM code), e C2 generator primitive (dispatchable bounds + non-zero cost, fixed-injection regression, explicit coeffs, median mid-merit, fallback); registry (defaults, needs-base, direction, unknown-name raises, extensibility); `max_delta_v` (true max abs diff, max bus ≠ candidate bus, None without base); `reactive_adequacy` (adequate, inadequate-with-reason, non-convergence); standard predicate unchanged; `_augment_generator_mutation` (dispatchable resolution, explicit-strategy error, Q-pin, non-generator untouched); sweep-handler integration (unknown metric/predicate clean error, metric recorded, **default payload unchanged**, dispatched-Pg recorded). Full suite: **868 passed, 3 skipped**. -### Decisions flagged for Slaven (non-blocking) +### Decisions flagged for further discussion (non-blocking) 1. Added-generator cost curve: case-median (default) vs an explicit typical mid-merit curve — drives the prompt-13 ranking entirely. 2. Prompt-15 switched-in load size (`switched_load_mw`) — the voltage step scales with it. @@ -173,7 +173,7 @@ For each candidate bus, a bisection on injection magnitude finds the largest inj System PF + PF-spec; candidate mutation on real ACTIVSg200 (PF ray, generator fixed injection, base untouched); binding identification (thermal/voltage with element, type-only fallback); bisection algorithm via synthetic oracle (boundary within tol, probe bound, cap-not-reached, first-probe-infeasible, convergence-as-infeasible); token-bounded boundary view (full vs summary, top-N bound, descending rank, 2000-bus size bound, grouped undetermined, threshold 0); `map_callables` (index order, exception capture, progress count); `_handle_boundary_sweep` orchestration (journals `max_feasible_mw`, one-LLM-turn invariant, base-infeasible abort, invalid-entity reject). Full suite: 836 passed, 3 skipped. -### Decisions flagged for Slaven (non-blocking) +### Decisions flagged for further discussion (non-blocking) 1. Generator reactive handling: `Qg` free within `±0.4·ΔP` (current default) vs fixed at 0 — affects voltage-limited hosting numbers. 2. PF source for the load prompt: system-average (default) vs each bus's own PF vs a stated PF. diff --git a/agentigrid/launcher/ARCHITECTURE.md b/agentigrid/launcher/ARCHITECTURE.md index f8fa76d3..6d4456c7 100644 --- a/agentigrid/launcher/ARCHITECTURE.md +++ b/agentigrid/launcher/ARCHITECTURE.md @@ -2,7 +2,7 @@ **Version:** 1.0 **Date:** 2026-03-27 -**Authors:** Samim / Claude (collaborative design) +**Authors:** Samim Konjicija / Claude (collaborative design) --- diff --git a/agentigrid/setup.py b/agentigrid/setup.py index 3e935fa4..2e74dccc 100644 --- a/agentigrid/setup.py +++ b/agentigrid/setup.py @@ -13,7 +13,7 @@ description="LLM-driven iterative simulation and analysis tool for ExaGO", long_description=long_description, long_description_content_type="text/markdown", - author="Slaven Peles", + author="Samim Konjicija", python_requires=">=3.10", packages=find_packages(exclude=["tests"]), install_requires=[ diff --git a/docs/AgentiGrid_modification_plan.md b/docs/AgentiGrid_modification_plan.md index cfb61f5e..b5e19b18 100644 --- a/docs/AgentiGrid_modification_plan.md +++ b/docs/AgentiGrid_modification_plan.md @@ -163,7 +163,7 @@ Slice 1 (✅ done): add-entity primitives + binary-feasibility sweep + sweep rep --- -## Open decisions for you / Slaven +## Open decisions 1. Confirm slice ordering — in particular whether B.1 (token view) jumps ahead of C1, given it gates the scaling half of the paper. 2. Prompt 18 (min hot reserve under N-1) is the heaviest single item (SCOPFLOW + custom minimization) — is it in-scope for this paper, or deferred? diff --git a/docs/manual/ExaGO_Manual.pdf b/docs/manual/ExaGO_Manual.pdf index fe249df055e34dcbbeba8fb1bf6dbd22abc37b54..803650933f14328d93e8e96fd83f8eb24e986ddb 100644 GIT binary patch delta 16175 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