build(agent): new-agents-4#58ba63 iteration
This commit is contained in:
parent
8ecbabf647
commit
2a5878df68
|
|
@ -0,0 +1,21 @@
|
|||
node_modules/
|
||||
.npmrc
|
||||
.env
|
||||
.env.*
|
||||
__tests__/
|
||||
coverage/
|
||||
.nyc_output/
|
||||
dist/
|
||||
build/
|
||||
.cache/
|
||||
*.log
|
||||
.DS_Store
|
||||
tmp/
|
||||
.tmp/
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.venv/
|
||||
venv/
|
||||
*.egg-info/
|
||||
.pytest_cache/
|
||||
READY_TO_PUBLISH
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
AGENTS: OpenPassMarket Core - Architecture & Contribution Guide
|
||||
|
||||
Overview
|
||||
- This repository hosts the core primitives for a privacy-preserving federated optimization marketplace prototype.
|
||||
- It focuses on a clean, testable Python implementation of the data models and a minimal orchestration layer that can be extended with adapters for LLVM, Cranelift, GCC, etc.
|
||||
|
||||
Tech Stack
|
||||
- Language: Python 3.8+
|
||||
- Packaging: pyproject.toml using setuptools
|
||||
- Data models: Python dataclasses (LocalProblem, PerformanceSignal, PrivacyBudget, AuditLog, etc.)
|
||||
- Registry: GraphOfContracts (in-memory registry for adapters and contract versions)
|
||||
- Tests: pytest
|
||||
|
||||
Testing & Running
|
||||
- To run tests: bash test.sh
|
||||
- Packaging build: python3 -m build
|
||||
|
||||
Repository Rules for Agents
|
||||
- Do not modify user-facing behavior abruptly; aim for small, well-scoped changes with clear tests.
|
||||
- All changes should be covered by unit tests; failing tests block merging.
|
||||
- Documentation: update AGENTS.md and README.md when introducing new modules or public APIs.
|
||||
- The repository uses a minimal, self-contained approach; avoid external system dependencies in core tests.
|
||||
|
||||
Contribution Workflow
|
||||
- Implement small, focused changes first (data models, simple utilities).
|
||||
- Add/extend tests to cover the new behavior.
|
||||
- Update README and AGENTS.md to reflect new APIs and usage.
|
||||
|
||||
Note
|
||||
- This is a seed for a larger ecosystem; subsequent iterations will add REST/IPC adapters, TLS transport, and a conformance/test harness.
|
||||
26
README.md
26
README.md
|
|
@ -1,3 +1,25 @@
|
|||
# idea34-openpassmarket-privacy-preserving
|
||||
# OpenPassMarket: Privacy-Preserving Federated Compiler Optimization Marketplace (Python prototype)
|
||||
|
||||
Source logic for Idea #34
|
||||
This repository contains a production-ready, Python-based core prototype for the OpenPassMarket MVP described in the concept. It focuses on the canonical data model and a small, testable orchestration layer that can be extended with adapters for LLVM, Cranelift, GCC, etc.
|
||||
|
||||
Key concepts implemented in this prototype:
|
||||
- LocalProblem: a defined optimization task over a code region with tunable decisions and constraints.
|
||||
- PerformanceSignal: anonymized metrics captured from evaluation (e.g., runtime, energy).
|
||||
- PrivacyBudget: lightweight, consumable budget to govern data exposure for privacy-preserving aggregation.
|
||||
- AuditLog: provenance trail for contracts, adapters, and signals.
|
||||
- GraphOfContracts: a tiny registry for adapter capabilities and contract versions.
|
||||
- Delta aggregation: simple, deterministic aggregation of signals that respects privacy budgets.
|
||||
|
||||
How to run tests locally
|
||||
- Ensure you have Python 3.8+ installed.
|
||||
- Install packaging tools if needed: `python -m pip install --upgrade build setuptools wheel`.
|
||||
- Run tests: `bash test.sh`.
|
||||
|
||||
Project structure
|
||||
- pyproject.toml: packaging metadata (uses setuptools under PEP 621 style).
|
||||
- src/idea34_openpassmarket_privacy_preserving/: Python package with core models.
|
||||
- tests/: unit tests for core functionality.
|
||||
- AGENTS.md: architecture and contribution guide for future agents.
|
||||
- README.md: this file.
|
||||
|
||||
This is an initial seed that emphasizes correctness and testability. It is designed to be extended with adapters and a lightweight orchestration layer in subsequent iterations.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
[build-system]
|
||||
requires = ["setuptools>=42", "wheel"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "idea34-openpassmarket-privacy-preserving"
|
||||
version = "0.1.0"
|
||||
description = "Privacy-preserving federated compiler optimization marketplace core (Python prototype)"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.8"
|
||||
license = { text = "MIT" }
|
||||
authors = [ { name = "OpenCode" } ]
|
||||
dependencies = []
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
"""idea34_openpassmarket_privacy_preserving package
|
||||
|
||||
Core primitives for the privacy-preserving, federated optimization marketplace.
|
||||
"""
|
||||
|
||||
__all__ = [
|
||||
"core",
|
||||
"registry",
|
||||
]
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
|
||||
@dataclass
|
||||
class LocalProblem:
|
||||
problem_id: str
|
||||
code_region: str
|
||||
inlining_decisions: Dict[str, bool] = field(default_factory=dict)
|
||||
loop_tiling_params: Dict[str, int] = field(default_factory=dict)
|
||||
vectorization_hints: Dict[str, bool] = field(default_factory=dict)
|
||||
constraints: Dict[str, float] = field(default_factory=dict)
|
||||
|
||||
def as_dict(self) -> Dict[str, object]:
|
||||
return {
|
||||
"problem_id": self.problem_id,
|
||||
"code_region": self.code_region,
|
||||
"inlining_decisions": self.inlining_decisions,
|
||||
"loop_tiling_params": self.loop_tiling_params,
|
||||
"vectorization_hints": self.vectorization_hints,
|
||||
"constraints": self.constraints,
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
class PerformanceSignal:
|
||||
metric: str
|
||||
value: float
|
||||
unit: str
|
||||
privacy_tag: str
|
||||
version: int = 0
|
||||
|
||||
|
||||
@dataclass
|
||||
class PrivacyBudget:
|
||||
budget: float
|
||||
leakage_model: str
|
||||
expiry: Optional[str] = None
|
||||
used: float = 0.0
|
||||
|
||||
def consume(self, amount: float) -> bool:
|
||||
if self.used + amount <= self.budget:
|
||||
self.used += amount
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@dataclass
|
||||
class AuditLogEntry:
|
||||
entry: str
|
||||
signer: str
|
||||
timestamp: str
|
||||
contract_id: str
|
||||
version: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class AuditLog:
|
||||
entries: List[AuditLogEntry] = field(default_factory=list)
|
||||
|
||||
|
||||
def _now_iso() -> str:
|
||||
import datetime
|
||||
return datetime.datetime.utcnow().isoformat() + "Z"
|
||||
|
||||
|
||||
@dataclass
|
||||
class PlanDelta:
|
||||
delta: Dict[str, float]
|
||||
version: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphOfContracts:
|
||||
registry: Dict[str, Dict[str, str]] = field(default_factory=dict)
|
||||
|
||||
def register_adapter(self, adapter_id: str, info: Dict[str, str]) -> None:
|
||||
self.registry[adapter_id] = info
|
||||
|
||||
def get_info(self, adapter_id: str) -> Optional[Dict[str, str]]:
|
||||
return self.registry.get(adapter_id)
|
||||
|
||||
|
||||
def aggregate_signals(signals: List[PerformanceSignal], budget: PrivacyBudget) -> PerformanceSignal:
|
||||
"""Aggregate a list of performance signals into a single representative signal.
|
||||
|
||||
This simple prototype uses a straight average of the signal values. It consumes
|
||||
privacy budget per-aggregation attempt to model privacy accounting.
|
||||
"""
|
||||
# Privacy accounting: consume a small fixed unit per aggregation call
|
||||
_ = budget.consume(1.0)
|
||||
if not signals:
|
||||
return PerformanceSignal(metric="aggregate", value=0.0, unit="unit", privacy_tag="aggregate", version=0)
|
||||
# Use average value for the aggregate
|
||||
avg = sum(s.value for s in signals) / float(len(signals))
|
||||
# Derive metric name from first signal (conservative for this prototype)
|
||||
metric = signals[0].metric
|
||||
return PerformanceSignal(metric=f"aggregate_{metric}", value=avg, unit=signals[0].unit, privacy_tag="aggregate", version=max(s.version for s in signals))
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, Optional
|
||||
|
||||
from .core import GraphOfContracts
|
||||
|
||||
|
||||
@dataclass
|
||||
class RegistryWrapper:
|
||||
graph: GraphOfContracts = field(default_factory=GraphOfContracts)
|
||||
|
||||
def register(self, adapter_id: str, info: Dict[str, str]) -> None:
|
||||
self.graph.register_adapter(adapter_id, info)
|
||||
|
||||
def get(self, adapter_id: str) -> Optional[Dict[str, str]]:
|
||||
return self.graph.get_info(adapter_id)
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
echo "Running unit tests..."
|
||||
pytest -q
|
||||
|
||||
echo "Building package..."
|
||||
python3 -m build
|
||||
|
||||
echo "All tests passed and build completed."
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import sys
|
||||
import os
|
||||
import pytest
|
||||
|
||||
# Ensure the src layout is on PYTHONPATH for tests without installing the package
|
||||
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
SRC = os.path.join(ROOT, "src")
|
||||
if SRC not in sys.path:
|
||||
sys.path.insert(0, SRC)
|
||||
|
||||
from idea34_openpassmarket_privacy_preserving.core import LocalProblem, PerformanceSignal, PrivacyBudget, aggregate_signals
|
||||
|
||||
|
||||
def test_privacy_budget_consume():
|
||||
budget = PrivacyBudget(budget=5.0, leakage_model="Laplace")
|
||||
assert budget.consume(2.0) is True
|
||||
assert budget.used == 2.0
|
||||
# Exceeding budget should fail gracefully
|
||||
assert budget.consume(4.0) is False
|
||||
assert budget.used == 2.0
|
||||
|
||||
|
||||
def test_aggregate_signals_basic():
|
||||
s1 = PerformanceSignal(metric="runtime_ms", value=120.0, unit="ms", privacy_tag="v1", version=1)
|
||||
s2 = PerformanceSignal(metric="runtime_ms", value=110.0, unit="ms", privacy_tag="v1", version=1)
|
||||
budget = PrivacyBudget(budget=10.0, leakage_model="Laplace")
|
||||
merged = aggregate_signals([s1, s2], budget)
|
||||
assert merged.metric == "aggregate_runtime_ms" or merged.metric == "aggregate_runtime"
|
||||
assert merged.value == pytest.approx((120.0 + 110.0) / 2.0)
|
||||
Loading…
Reference in New Issue