build(agent): molt-y#23e5c8 iteration
This commit is contained in:
parent
dd19b95f57
commit
03893093aa
|
|
@ -12,6 +12,13 @@ What you can run now
|
||||||
- Tests: npm test
|
- Tests: npm test
|
||||||
- Source: src/mesh.js, src/solver_admm.js, test/test.js
|
- Source: src/mesh.js, src/solver_admm.js, test/test.js
|
||||||
|
|
||||||
|
Protocol scaffolding (0.2)
|
||||||
|
- Added a minimal protocol skeleton for LocalProblem, SharedVariables, and PlanDelta under src/protocol/0_2_schema.js.
|
||||||
|
- Introduced a lightweight in-repo Contracts Registry (src/contracts_registry.js) to bootstrap cross-adapter data contracts.
|
||||||
|
- Extended the ADMM-lite solver (src/solver_admm.js) with a deterministic baseline adapter-capable solve() path.
|
||||||
|
- Two starter adapters (inverter, meter) remain compatible and can interface with the new protocol scaffolding.
|
||||||
|
- This scaffolding lays groundwork for offline-first distributed optimization and CatOpt-style interoperability; see test coverage for integration hooks.
|
||||||
|
|
||||||
How to extend
|
How to extend
|
||||||
- Implement new adapters (e.g., inverter, meter) that plug into EnergyMesh via registerAdmmAdapter.
|
- Implement new adapters (e.g., inverter, meter) that plug into EnergyMesh via registerAdmmAdapter.
|
||||||
- Extend computeFlow with more sophisticated physical models or forecasting inputs.
|
- Extend computeFlow with more sophisticated physical models or forecasting inputs.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Lightweight in-repo registry for protocol contracts (LocalProblem/SharedVariables/PlanDelta)
|
||||||
|
// This is intentionally minimal and in-memory to bootstrap the MVP workflow.
|
||||||
|
|
||||||
|
class ContractsRegistry {
|
||||||
|
constructor() {
|
||||||
|
this._registry = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
registerContract(name, schema) {
|
||||||
|
if (!name || typeof name !== 'string') {
|
||||||
|
throw new Error('Contract name must be a non-empty string');
|
||||||
|
}
|
||||||
|
if (!schema || typeof schema !== 'object') {
|
||||||
|
throw new Error('Schema must be an object');
|
||||||
|
}
|
||||||
|
this._registry[name] = schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
getContract(name) {
|
||||||
|
return this._registry[name];
|
||||||
|
}
|
||||||
|
|
||||||
|
listContracts() {
|
||||||
|
return Object.keys(this._registry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Singleton instance for simple usage across modules
|
||||||
|
const registry = new ContractsRegistry();
|
||||||
|
|
||||||
|
function registerContract(name, schema) {
|
||||||
|
registry.registerContract(name, schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getContract(name) {
|
||||||
|
return registry.getContract(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
ContractsRegistry,
|
||||||
|
registry,
|
||||||
|
registerContract,
|
||||||
|
getContract
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Protocol 0.2 skeleton: LocalProblem, SharedVariables, PlanDelta schemas
|
||||||
|
// This file provides a minimal, well-typed shape to bootstrap adapters.
|
||||||
|
|
||||||
|
const LocalProblemSchema = {
|
||||||
|
// Unique identifier for the problem in the local device context
|
||||||
|
id: 'string',
|
||||||
|
// Human-friendly name
|
||||||
|
name: 'string',
|
||||||
|
// Variables involved in the optimization (names and bounds)
|
||||||
|
variables: 'object', // e.g., { v1: {min, max}, v2: {min, max} }
|
||||||
|
// Objective (quadratic or linear) descriptor
|
||||||
|
objective: 'object', // placeholder for { type, coefficients }
|
||||||
|
// Constraints (simple, friendly for MVP)
|
||||||
|
constraints: 'object'
|
||||||
|
};
|
||||||
|
|
||||||
|
const SharedVariablesSchema = {
|
||||||
|
// Round-based shared state used in ADMM iterations
|
||||||
|
rounds: 'number',
|
||||||
|
// Shared variable values by name
|
||||||
|
values: 'object' // e.g., { x1: 1.2, x2: 3.4 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const PlanDeltaSchema = {
|
||||||
|
// Delta from the latest local plan, used for delta-syncs
|
||||||
|
delta: 'object', // e.g., { updatedVars: [...], deltaValues: {...} }
|
||||||
|
// Versioning for deterministic reconciliation
|
||||||
|
version: 'number',
|
||||||
|
// Audit timestamp
|
||||||
|
timestamp: 'number'
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
LocalProblemSchema,
|
||||||
|
SharedVariablesSchema,
|
||||||
|
PlanDeltaSchema
|
||||||
|
};
|
||||||
|
|
@ -2,6 +2,11 @@
|
||||||
// This module is intentionally lightweight: it provides a skeleton class
|
// This module is intentionally lightweight: it provides a skeleton class
|
||||||
// that can be extended by adapters in downstream integrations.
|
// that can be extended by adapters in downstream integrations.
|
||||||
|
|
||||||
|
const { LocalAdapterBridge } = (() => {
|
||||||
|
// Tiny bridge to illustrate adapters interoperability (no runtime dependency)
|
||||||
|
return { LocalAdapterBridge: class { constructor() {} } };
|
||||||
|
})();
|
||||||
|
|
||||||
class AdmmSolver {
|
class AdmmSolver {
|
||||||
constructor() {
|
constructor() {
|
||||||
// no state for MVP; placeholder for future stateful solvers
|
// no state for MVP; placeholder for future stateful solvers
|
||||||
|
|
@ -9,16 +14,42 @@ class AdmmSolver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Solve a local optimization problem given a shared variable state.
|
* Solve a local optimization problem given a shared variable state.
|
||||||
* For the MVP, we return null to indicate no local adaptation is applied,
|
* MVP: provide a lightweight, deterministic baseline adaptation for two-agent
|
||||||
* allowing the caller to fall back to baseline flow calculation.
|
* scenarios (inverter + storage). This is a stub implementation that can be
|
||||||
|
* extended by adapters for real optimization.
|
||||||
*
|
*
|
||||||
* @param {Object} localProblem - simplified representation of the local optimization problem
|
* @param {Object} localProblem - simplified representation of the local optimization problem
|
||||||
* @param {Object} sharedVariables - shared variables/state used in ADMM iterations
|
* @param {Object} sharedVariables - shared variables/state used in ADMM iterations
|
||||||
* @returns {Object|null} adaptation results or null to indicate no adaptation
|
* @returns {Object|null} adaptation results or null to indicate no adaptation
|
||||||
*/
|
*/
|
||||||
solve(localProblem, sharedVariables) {
|
solve(localProblem, sharedVariables) {
|
||||||
// MVP: do not modify flow; keep baseline behavior.
|
// If either input is missing, do not adapt.
|
||||||
return null;
|
if (!localProblem || !sharedVariables) return null;
|
||||||
|
|
||||||
|
// Very small, deterministic baseline: compute a simple local plan by weighting
|
||||||
|
// the localProblem's target and the first shared variable. This is only to
|
||||||
|
// demonstrate a non-trivial integration point for MVP and should be replaced
|
||||||
|
// with a real ADMM step in a fuller implementation.
|
||||||
|
const t = typeof localProblem.target === 'number' ? localProblem.target : 0;
|
||||||
|
const s0 = typeof sharedVariables[0] === 'number' ? sharedVariables[0] : 0;
|
||||||
|
const planValue = (0.5 * t) + (0.5 * s0);
|
||||||
|
|
||||||
|
const adaptation = {
|
||||||
|
localPlan: {
|
||||||
|
value: planValue,
|
||||||
|
details: {
|
||||||
|
localTarget: t,
|
||||||
|
sharedSignal: s0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
metadata: {
|
||||||
|
version: 0.2,
|
||||||
|
timestamp: Date.now()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Return a minimal adaptation structure understood by downstream consumers.
|
||||||
|
return adaptation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue