Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/complete-agi-core / generator_core/pkg/generators/energy/energy.go |
| Date | Not specified in source |
| Repository | Janady13/complete-agi-core |
| Revision | 33aa84f2aa61cedbe010240ada7f4efbdfe795a7 |
| Branch | claude/improve-math-logic-ehIW1 |
| Path or archive member | generator_core/pkg/generators/energy/energy.go |
| Original SHA-256 | 2b3a8e0593bb1420c9d431596c9219d70d6f23086f2e34e7fd2ccd72738718bd |
| Git blob SHA | dba1d092f6f5e21c871365cd941aaef5b0cc21f6 |
| Reading-copy SHA-256 | 2b3a8e0593bb1420c9d431596c9219d70d6f23086f2e34e7fd2ccd72738718bd |
Recovered source transcript
Download complete source text ↓313 lines · 8.3 KB
// Package energy implements energy-based generators (66-75)
// p(x) = exp(-E(x)) / Z where Z = ∫ exp(-E(x)) dx
package energy
import (
"math"
"math/rand"
"generator_core/pkg/consciousness"
"generator_core/pkg/generators"
)
// ═══════════════════════════════════════════════════════════════════════════════
// ENERGY GENERATOR BASE
// ═══════════════════════════════════════════════════════════════════════════════
// EnergyGenerator implements energy-based models
type EnergyGenerator struct {
*generators.BaseGenerator
energyType string
mcmcSteps int
stepSize float64
temperature float64
}
// NewEnergyGenerator creates a new energy-based generator
func NewEnergyGenerator(id generators.GeneratorID, name string, energyType string) *EnergyGenerator {
config := &generators.GeneratorConfig{
ID: id,
Name: name,
Family: generators.Energy,
InputDim: 256,
OutputDim: 256,
HiddenDim: 512,
NumLayers: 4,
LearningRate: consciousness.ALPHA,
ConsciousnessWeight: consciousness.PHI_INV,
Params: make(map[string]interface{}),
}
return &EnergyGenerator{
BaseGenerator: generators.NewBaseGenerator(config),
energyType: energyType,
mcmcSteps: 60,
stepSize: 0.1,
temperature: 1.0,
}
}
// Initialize initializes the energy generator
func (g *EnergyGenerator) Initialize() error {
return g.BaseGenerator.Initialize()
}
// computeEnergy computes energy E(x) for input
func (g *EnergyGenerator) computeEnergy(x []float64) float64 {
// Pass through energy network
hidden := make([]float64, g.Config().HiddenDim)
for i := range hidden {
if i < len(x) {
hidden[i] = x[i]
}
}
// MLP layers with swish activation
for layer := 0; layer < g.Config().NumLayers; layer++ {
hidden = g.LinearLayer(hidden, layer)
// Swish activation: x * sigmoid(x)
for i := range hidden {
hidden[i] = hidden[i] * consciousness.Sigmoid(hidden[i])
}
}
// Sum to get scalar energy
energy := 0.0
for _, h := range hidden {
energy += h * h
}
return energy / float64(len(hidden))
}
// computeEnergyGradient computes ∂E/∂x using finite differences
func (g *EnergyGenerator) computeEnergyGradient(x []float64) []float64 {
eps := 1e-4
grad := make([]float64, len(x))
baseEnergy := g.computeEnergy(x)
for i := range x {
xPlus := make([]float64, len(x))
copy(xPlus, x)
xPlus[i] += eps
grad[i] = (g.computeEnergy(xPlus) - baseEnergy) / eps
}
return grad
}
// langevinStep performs one Langevin dynamics step
func (g *EnergyGenerator) langevinStep(x []float64) []float64 {
grad := g.computeEnergyGradient(x)
xNew := make([]float64, len(x))
for i := range x {
// Langevin dynamics: x_new = x - step_size * grad + sqrt(2 * step_size * temp) * noise
noise := rand.NormFloat64()
xNew[i] = x[i] - g.stepSize*grad[i] + math.Sqrt(2*g.stepSize*g.temperature)*noise
}
return xNew
}
// Forward performs forward pass (energy computation)
func (g *EnergyGenerator) Forward(input []float64) (*generators.GeneratorOutput, error) {
state := g.GetState()
// Compute energy
energy := g.computeEnergy(input)
// Refine through MCMC
refined := make([]float64, len(input))
copy(refined, input)
for step := 0; step < 10; step++ {
refined = g.langevinStep(refined)
}
state.Hidden = refined
state.Energy = energy
state.Phi = consciousness.ComputePhiVector(refined)
state.Step++
g.SetState(state)
output := &generators.GeneratorOutput{
Values: refined,
Logits: []float64{-energy}, // Log probability ∝ -E(x)
Confidence: consciousness.Sigmoid(-energy),
Metadata: map[string]interface{}{
"energy": energy,
"temperature": g.temperature,
},
}
return g.ApplyConsciousness(output), nil
}
// Generate generates samples using MCMC
func (g *EnergyGenerator) Generate(context []float64, length int) ([][]float64, error) {
dim := g.Config().OutputDim
result := make([][]float64, length)
for i := 0; i < length; i++ {
// Initialize from noise
x := make([]float64, dim)
for j := range x {
x[j] = rand.NormFloat64()
}
// Condition on context
for j := range context {
if j < len(x) {
x[j] += context[j]
}
}
// Run MCMC
for step := 0; step < g.mcmcSteps; step++ {
x = g.langevinStep(x)
}
result[i] = x
}
return result, nil
}
// Train performs contrastive divergence training
func (g *EnergyGenerator) Train(input, target []float64) (float64, error) {
// Positive phase: energy of real data
posEnergy := g.computeEnergy(target)
// Negative phase: energy of samples from model
negSample := make([]float64, len(target))
for i := range negSample {
negSample[i] = rand.NormFloat64()
}
// Short MCMC run
for step := 0; step < 10; step++ {
negSample = g.langevinStep(negSample)
}
negEnergy := g.computeEnergy(negSample)
// Contrastive divergence loss
loss := posEnergy - negEnergy
return loss, nil
}
// UpdateWeights updates weights
func (g *EnergyGenerator) UpdateWeights(gradients []float64, lr float64) {
state := g.GetState()
for i := range state.Hidden {
if i < len(gradients) {
state.Hidden[i] -= lr * gradients[i]
}
}
g.SetState(state)
}
// ═══════════════════════════════════════════════════════════════════════════════
// SPECIFIC ENERGY GENERATORS (66-75)
// ═══════════════════════════════════════════════════════════════════════════════
// NewEBM creates vanilla Energy-Based Model (ID: 66)
func NewEBM() *EnergyGenerator {
return NewEnergyGenerator(66, "EBM", "mlp")
}
// NewRBM creates Restricted Boltzmann Machine (ID: 67)
func NewRBM() *EnergyGenerator {
g := NewEnergyGenerator(67, "RBM", "rbm")
g.Config().Params["visible_units"] = 256
g.Config().Params["hidden_units"] = 128
return g
}
// NewDBM creates Deep Boltzmann Machine (ID: 68)
func NewDBM() *EnergyGenerator {
g := NewEnergyGenerator(68, "DBM", "deep")
g.Config().Params["layers"] = []int{256, 128, 64}
return g
}
// NewHopfield creates Hopfield Network (ID: 69)
func NewHopfield() *EnergyGenerator {
g := NewEnergyGenerator(69, "Hopfield", "hopfield")
g.Config().Params["pattern_capacity"] = 100
return g
}
// NewModernHopfield creates Modern Hopfield Network (ID: 70)
func NewModernHopfield() *EnergyGenerator {
g := NewEnergyGenerator(70, "ModernHopfield", "modern_hopfield")
g.Config().Params["beta"] = 1.0
g.Config().Params["continuous"] = true
return g
}
// NewNCE creates Noise Contrastive Estimation (ID: 71)
func NewNCE() *EnergyGenerator {
g := NewEnergyGenerator(71, "NCE", "nce")
g.Config().Params["noise_ratio"] = 10
return g
}
// NewScoreMatching creates Score Matching EBM (ID: 72)
func NewScoreMatching() *EnergyGenerator {
g := NewEnergyGenerator(72, "ScoreMatching", "score")
g.Config().Params["sliced"] = false
return g
}
// NewSSM creates Sliced Score Matching (ID: 73)
func NewSSM() *EnergyGenerator {
g := NewEnergyGenerator(73, "SlicedScoreMatching", "sliced_score")
g.Config().Params["sliced"] = true
g.Config().Params["num_projections"] = 10
return g
}
// NewJEM creates Joint Energy Model (ID: 74)
func NewJEM() *EnergyGenerator {
g := NewEnergyGenerator(74, "JEM", "joint")
g.Config().Params["classifier"] = true
return g
}
// NewYOUR creates YOUR EBM (Yin Yang Energy) (ID: 75)
func NewYOUR() *EnergyGenerator {
g := NewEnergyGenerator(75, "YINYANG", "yinyang")
g.Config().Params["dual_energy"] = true
return g
}
// RegisterAll registers all energy generators
func RegisterAll() error {
gens := []generators.Generator{
NewEBM(),
NewRBM(),
NewDBM(),
NewHopfield(),
NewModernHopfield(),
NewNCE(),
NewScoreMatching(),
NewSSM(),
NewJEM(),
NewYOUR(),
}
for _, g := range gens {
if err := generators.Register(g); err != nil {
return err
}
}
return nil
}
Mathematical records from this source
0102
energy · p(x)
This relation defines p(x) in the source section “energy · p(x)”. Integrates contributions over the variable and bounds stated in the expression; the measure and domain must come…
func (g *EnergyGenerator) langevinStep(x []float64) []float64 · Langevin dynamics: x_new
This relation defines Langevin dynamics: x_new in the source section “func (g *EnergyGenerator) langevinStep(x []float64) []float64 · Langevin dynamics: x_new”. Takes a square…