Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
171
examples/edge-net/sim/dist/phases.js
vendored
Normal file
171
examples/edge-net/sim/dist/phases.js
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
/**
|
||||
* Phase Transition Logic
|
||||
* Manages lifecycle phases and transition conditions
|
||||
*/
|
||||
import { NetworkPhase } from './network.js';
|
||||
import { CellType, CellState } from './cell.js';
|
||||
export class PhaseManager {
|
||||
network;
|
||||
metrics;
|
||||
conditions;
|
||||
lastPhase;
|
||||
constructor(network, metrics) {
|
||||
this.network = network;
|
||||
this.metrics = metrics;
|
||||
this.lastPhase = NetworkPhase.GENESIS;
|
||||
this.conditions = new Map([
|
||||
[NetworkPhase.GENESIS, {
|
||||
minNodes: 0,
|
||||
maxNodes: 10000,
|
||||
}],
|
||||
[NetworkPhase.GROWTH, {
|
||||
minNodes: 10000,
|
||||
maxNodes: 50000,
|
||||
customCheck: (net) => {
|
||||
// Verify genesis nodes are still active but reducing multiplier
|
||||
const genesisCells = Array.from(net.cells.values())
|
||||
.filter((c) => c.type === CellType.GENESIS);
|
||||
const avgMultiplier = genesisCells.reduce((sum, c) => sum + c.genesisMultiplier, 0) / genesisCells.length;
|
||||
return avgMultiplier < 10 && avgMultiplier > 1;
|
||||
},
|
||||
}],
|
||||
[NetworkPhase.MATURATION, {
|
||||
minNodes: 50000,
|
||||
maxNodes: 100000,
|
||||
customCheck: (net) => {
|
||||
// Verify genesis nodes are entering read-only mode
|
||||
const genesisCells = Array.from(net.cells.values())
|
||||
.filter((c) => c.type === CellType.GENESIS);
|
||||
const readOnlyCount = genesisCells.filter(c => c.state === CellState.READ_ONLY).length;
|
||||
return readOnlyCount >= genesisCells.length * 0.5; // At least 50% read-only
|
||||
},
|
||||
}],
|
||||
[NetworkPhase.INDEPENDENCE, {
|
||||
minNodes: 100000,
|
||||
maxNodes: Infinity,
|
||||
customCheck: (net) => {
|
||||
// Verify genesis nodes are retired
|
||||
const genesisCells = Array.from(net.cells.values())
|
||||
.filter((c) => c.type === CellType.GENESIS);
|
||||
const retiredCount = genesisCells.filter(c => c.state === CellState.RETIRED).length;
|
||||
return retiredCount >= genesisCells.length * 0.8; // At least 80% retired
|
||||
},
|
||||
}],
|
||||
]);
|
||||
}
|
||||
/**
|
||||
* Check if network should transition to next phase
|
||||
*/
|
||||
checkTransition() {
|
||||
const currentPhase = this.network.currentPhase;
|
||||
const nodeCount = this.network.cells.size;
|
||||
// Determine target phase based on node count
|
||||
let targetPhase = NetworkPhase.GENESIS;
|
||||
if (nodeCount >= 100000) {
|
||||
targetPhase = NetworkPhase.INDEPENDENCE;
|
||||
}
|
||||
else if (nodeCount >= 50000) {
|
||||
targetPhase = NetworkPhase.MATURATION;
|
||||
}
|
||||
else if (nodeCount >= 10000) {
|
||||
targetPhase = NetworkPhase.GROWTH;
|
||||
}
|
||||
// If phase changed, validate transition
|
||||
if (targetPhase !== currentPhase) {
|
||||
const condition = this.conditions.get(targetPhase);
|
||||
if (condition) {
|
||||
// Check node count bounds
|
||||
if (nodeCount < condition.minNodes || nodeCount >= condition.maxNodes) {
|
||||
return false;
|
||||
}
|
||||
// Check custom conditions
|
||||
if (condition.customCheck && !condition.customCheck(this.network)) {
|
||||
return false;
|
||||
}
|
||||
// Valid transition
|
||||
this.onTransition(currentPhase, targetPhase);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Handle phase transition
|
||||
*/
|
||||
onTransition(fromPhase, toPhase) {
|
||||
console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
||||
console.log(`🔄 PHASE TRANSITION: ${fromPhase.toUpperCase()} → ${toPhase.toUpperCase()}`);
|
||||
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
||||
// Notify metrics collector
|
||||
this.metrics.onPhaseTransition(fromPhase, toPhase);
|
||||
// Log phase-specific information
|
||||
this.logPhaseInfo(toPhase);
|
||||
this.lastPhase = toPhase;
|
||||
}
|
||||
/**
|
||||
* Log phase-specific information
|
||||
*/
|
||||
logPhaseInfo(phase) {
|
||||
const stats = this.network.getStats();
|
||||
console.log(`📊 Network Status:`);
|
||||
console.log(` Nodes: ${stats.nodeCount.toLocaleString()}`);
|
||||
console.log(` Genesis Nodes: ${stats.genesisNodes.count}`);
|
||||
console.log(` Avg Connections: ${stats.network.avgConnections.toFixed(2)}`);
|
||||
console.log(` Total Energy: ${stats.economy.totalEnergy.toFixed(2)} rUv`);
|
||||
switch (phase) {
|
||||
case NetworkPhase.GENESIS:
|
||||
console.log(`\n🌱 Genesis Phase:`);
|
||||
console.log(` - Genesis nodes establishing network`);
|
||||
console.log(` - 10x energy multiplier active`);
|
||||
console.log(` - Target: 10,000 nodes`);
|
||||
break;
|
||||
case NetworkPhase.GROWTH:
|
||||
console.log(`\n🌿 Growth Phase:`);
|
||||
console.log(` - Genesis multiplier: ${stats.genesisNodes.avgMultiplier.toFixed(2)}x`);
|
||||
console.log(` - Genesis nodes reducing connections`);
|
||||
console.log(` - Network self-organizing`);
|
||||
console.log(` - Target: 50,000 nodes`);
|
||||
break;
|
||||
case NetworkPhase.MATURATION:
|
||||
console.log(`\n🌳 Maturation Phase:`);
|
||||
console.log(` - Genesis nodes: ${stats.genesisNodes.readOnly} read-only`);
|
||||
console.log(` - Network operating independently`);
|
||||
console.log(` - Economic sustainability: ${(stats.economy.totalEarned / Math.max(stats.economy.totalSpent, 1)).toFixed(2)}x`);
|
||||
console.log(` - Target: 100,000 nodes`);
|
||||
break;
|
||||
case NetworkPhase.INDEPENDENCE:
|
||||
console.log(`\n🚀 Independence Phase:`);
|
||||
console.log(` - Genesis nodes: ${stats.genesisNodes.retired} retired`);
|
||||
console.log(` - Pure P2P operation`);
|
||||
console.log(` - Network fully autonomous`);
|
||||
console.log(` - Target: Long-term stability`);
|
||||
break;
|
||||
}
|
||||
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
|
||||
}
|
||||
/**
|
||||
* Get phase progress (0-1)
|
||||
*/
|
||||
getPhaseProgress() {
|
||||
const condition = this.conditions.get(this.network.currentPhase);
|
||||
if (!condition)
|
||||
return 0;
|
||||
const nodeCount = this.network.cells.size;
|
||||
const range = condition.maxNodes - condition.minNodes;
|
||||
const progress = (nodeCount - condition.minNodes) / range;
|
||||
return Math.max(0, Math.min(1, progress));
|
||||
}
|
||||
/**
|
||||
* Get estimated ticks to next phase
|
||||
*/
|
||||
getTicksToNextPhase() {
|
||||
const condition = this.conditions.get(this.network.currentPhase);
|
||||
if (!condition || condition.maxNodes === Infinity)
|
||||
return -1;
|
||||
const nodeCount = this.network.cells.size;
|
||||
const nodesNeeded = condition.maxNodes - nodeCount;
|
||||
const ticksNeeded = Math.ceil(nodesNeeded / this.network.config.nodesPerTick);
|
||||
return Math.max(0, ticksNeeded);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=phases.js.map
|
||||
Reference in New Issue
Block a user