🔄 See Post 859 for the improved version using only series as data structure.
Post 859 rewrites this solver following universal-model philosophy:
series: [], nothing elseThis post (858) shows the initial approach with multiple data structures. Post 859 shows the pure series evolution.
From Post 509: Minimal decision circuit - 80% confident → act, ignorant → randomize, uncertain → calculate
From Post 857: Chess exploration rate-limited by Economic, Objective, W tracking, Topology
New: Minimal chess solver = Post 509 framework + Post 857 constraints
Result: Three-state chess engine - simpler than any existing engine, naturally rate-limited
class MinimalChessSolver:
"""
Simplest possible chess solver
Implements Post 509 decision circuit for chess
"""
def choose_move(self, position):
"""
Three-state decision: Confident, Ignorant, or Uncertain
"""
# Get evaluation of current position
eval_score = quick_evaluation(position)
# STATE 1: HIGH CONFIDENCE (≥ +2.0 advantage)
if eval_score >= 2.0:
# We're winning significantly
# C = 1 (confident) → Execute immediately
return best_move_from_quick_eval(position)
# STATE 2: COMPLETE IGNORANCE (no positions explored)
elif not has_explored_position_before(position):
# Never seen this position
# I = 0 (no information) → Randomize
return random.choice(legal_moves(position))
# STATE 3: UNCERTAIN (have info, not confident)
else:
# Position explored before, but unclear
# I = 1, C < 0.8 → Search deeper (calculate EV)
return search_with_rate_limiters(position)
That’s it. Three states. Nothing more needed.
From Post 509: 80% sure → act immediately
In chess: Confidence = evaluation advantage
def is_confident(eval_score):
"""
Confidence threshold for chess positions
"""
return {
'eval_threshold': 2.0, # Pawns advantage
'why_2.0': {
'reason': 'Empirically Pareto-optimal',
'too_high_3.0': 'Miss good moves waiting for crushing advantage',
'too_low_1.0': 'Move on insufficient advantage',
'2.0_goldilocks': 'Balanced - significant but achievable'
},
'confidence_levels': {
'eval >= 3.0': 'C = 0.95 (almost certain win)',
'eval >= 2.0': 'C = 0.80 (confident - threshold)',
'eval >= 1.0': 'C = 0.60 (slight advantage)',
'eval >= 0.0': 'C = 0.50 (equal)',
'eval < 0.0': 'C < 0.50 (disadvantage)'
},
'decision': 'If eval >= 2.0: Move immediately (State 1)'
}
Examples:
Position: You're up a rook (+5.0 eval)
Confidence: 95%
Decision: Play obvious winning move immediately
Reasoning: Don't overthink when winning
Position: You're up two pawns (+2.0 eval)
Confidence: 80% (threshold)
Decision: Play best move from quick analysis
Reasoning: Significant advantage, execute
Position: Equal material (+0.2 eval)
Confidence: 55%
Decision: Search deeper (State 3)
Reasoning: Unclear position, need more analysis
Position: Never seen before
Confidence: N/A (no data)
Decision: Random legal move (State 2)
Reasoning: Exploration generates information
def has_information(position):
"""
Information check: Do we know anything about this position?
"""
return {
'position_seen_before': {
'check': 'Is position in transposition table?',
'yes': 'I = 1 (have information)',
'no': 'I = 0 (ignorance)'
},
'opening_book': {
'check': 'Is position in opening theory?',
'yes': 'I = 1 (theory exists)',
'no': 'I = 0 (unexplored line)'
},
'endgame_tablebase': {
'check': 'Is position in tablebase?',
'yes': 'I = 1 (perfect information)',
'no': 'Check other sources'
},
'previous_games': {
'check': 'Have we played this position before?',
'yes': 'I = 1 (experience exists)',
'no': 'I = 0 (novel position)'
},
'decision': {
'if_I_0': 'Randomize (exploration)',
'if_I_1': 'Use information (search or execute)'
}
}
State 2 trigger: I = 0
Position: Never seen, not in book, no similar games
Information: I = 0
Decision: Play random legal move
Why: Exploration phase - any move generates data
Position: Opening move 1
Information: I = 0 (infinite possibilities)
Decision: Random opening (e4, d4, Nf3, c4, etc.)
Why: Break symmetry, explore different lines
Position: Novel middlegame
Information: I = 0
Decision: Random reasonable move
Why: Generate experience, learn what works
From Post 857: Four rate limiters control search depth
def search_with_rate_limiters(position):
"""
State 3: Have information, not confident
Search deeper with natural rate limiting
"""
# Initialize rate limiter factors (from Post 857)
R_economic = check_computation_budget()
R_objective = evaluate_position_quality(position)
R_w_tracking = check_positions_explored()
R_topology = count_legal_moves(position)
# Combined rate limiter (Post 857 formula)
R = (
R_economic * 0.3 +
R_objective * 0.3 +
R_w_tracking * 0.2 +
R_topology * 0.2
)
# Search depth determined by R
if R > 0.7:
depth = 6 # Deep search (favorable conditions)
elif R > 0.4:
depth = 3 # Moderate search
else:
depth = 1 # Shallow search (adverse conditions)
# Search and return best move
return alpha_beta_search(position, depth)
Economic limiter:
def check_computation_budget():
"""
How much CPU time remaining?
"""
time_remaining = get_time_left_on_clock()
time_per_move = time_remaining / estimated_moves_left
if time_per_move > 30:
return 1.0 # Plenty of time
elif time_per_move > 10:
return 0.6 # Moderate time
else:
return 0.2 # Time pressure
Objective limiter:
def evaluate_position_quality(position):
"""
Is position worth deep search?
"""
eval_score = quick_evaluation(position)
if abs(eval_score) < 0.5:
return 1.0 # Critical position, search deep
elif abs(eval_score) < 1.5:
return 0.6 # Interesting position
else:
return 0.2 # One-sided, shallow search sufficient
W tracking limiter:
def check_positions_explored():
"""
How many positions have we evaluated?
"""
positions_explored = get_node_count()
position_budget = 1_000_000 # One million nodes
ratio = positions_explored / position_budget
if ratio < 0.5:
return 1.0 # Under budget
elif ratio < 0.9:
return 0.5 # Near budget
else:
return 0.1 # At budget, stop soon
Topology limiter:
def count_legal_moves(position):
"""
How many legal moves from this position?
"""
legal_move_count = len(legal_moves(position))
if legal_move_count > 40:
return 1.0 # Open position, explore
elif legal_move_count > 20:
return 0.6 # Moderate
else:
return 0.3 # Closed position, less to search
class MinimalChessSolver:
"""
Complete minimal chess solver
Post 509 decision circuit + Post 857 rate limiters
"""
def __init__(self):
self.transposition_table = {}
self.positions_explored = 0
self.time_budget = 60 # seconds per move
def choose_move(self, position):
"""
Main decision function - three states
"""
# Quick evaluation
eval_score = self.evaluate(position)
# STATE 1: CONFIDENT (eval >= +2.0)
if eval_score >= 2.0:
return self.execute_immediately(position)
# STATE 2: IGNORANT (never seen position)
elif position not in self.transposition_table:
return self.randomize(position)
# STATE 3: UNCERTAIN (have data, not confident)
else:
return self.search_with_limiters(position)
def evaluate(self, position):
"""
Quick evaluation: material + position
"""
material_balance = (
count_pieces(position, 'white') -
count_pieces(position, 'black')
)
positional_bonus = (
control_center(position) * 0.3 +
king_safety(position) * 0.2
)
return material_balance + positional_bonus
def execute_immediately(self, position):
"""
STATE 1: High confidence → fast move
"""
legal = legal_moves(position)
# Pick move that maintains/increases advantage
best_move = None
best_eval = -999
for move in legal:
next_pos = make_move(position, move)
eval = self.evaluate(next_pos)
if eval > best_eval:
best_eval = eval
best_move = move
# Record in transposition table
self.transposition_table[position] = best_move
return best_move
def randomize(self, position):
"""
STATE 2: No information → random exploration
"""
legal = legal_moves(position)
# Random move (exploration)
move = random.choice(legal)
# Record that we've seen this position
self.transposition_table[position] = move
return move
def search_with_limiters(self, position):
"""
STATE 3: Informed but uncertain → rate-limited search
"""
# Calculate rate limiters (Post 857)
R_economic = self.time_budget / 60 # Normalize
R_objective = min(1.0, abs(self.evaluate(position)))
R_w_tracking = max(0.1, 1.0 - self.positions_explored / 1_000_000)
R_topology = len(legal_moves(position)) / 50
# Combined rate (weighted)
R = (
R_economic * 0.3 +
R_objective * 0.3 +
R_w_tracking * 0.2 +
min(1.0, R_topology) * 0.2
)
# Depth based on R
if R > 0.7:
depth = 5
elif R > 0.4:
depth = 3
else:
depth = 1
# Alpha-beta search
best_move, eval = self.alpha_beta(position, depth, -999, 999, True)
# Store in transposition table
self.transposition_table[position] = best_move
return best_move
def alpha_beta(self, position, depth, alpha, beta, maximizing):
"""
Standard alpha-beta search (simplified)
"""
self.positions_explored += 1
if depth == 0:
return None, self.evaluate(position)
legal = legal_moves(position)
if maximizing:
max_eval = -999
best_move = None
for move in legal:
next_pos = make_move(position, move)
_, eval = self.alpha_beta(next_pos, depth-1, alpha, beta, False)
if eval > max_eval:
max_eval = eval
best_move = move
alpha = max(alpha, eval)
if beta <= alpha:
break
return best_move, max_eval
else:
min_eval = 999
best_move = None
for move in legal:
next_pos = make_move(position, move)
_, eval = self.alpha_beta(next_pos, depth-1, alpha, beta, True)
if eval < min_eval:
min_eval = eval
best_move = move
beta = min(beta, eval)
if beta <= alpha:
break
return best_move, min_eval
That’s the complete spec. ~100 lines total.
Traditional chess engine:
Minimal solver:
What’s removed:
What’s kept:
1. Simplicity:
2. Natural rate limiting:
3. Exploration:
4. Confidence-based:
1. Strength:
2. Evaluation:
3. Opening:
But: For a minimal solver, surprisingly capable. Would beat casual players, learn over time through transposition table accumulation.
Move 1 (White):
Position: Starting position
Information: Never seen (I = 0)
Decision: Random legal move
Result: Plays random opening (maybe d4)
Move 2 (Black):
Position: After d4, never seen this exact position
Information: I = 0
Decision: Random response
Result: Plays random defense (maybe Nf6)
Moves 3-10 (Opening):
Positions: Mostly novel
Information: I = 0 mostly
Decision: Random but legal moves
Result: Unconventional but valid opening
Builds transposition table
Move 15 (Middlegame):
Position: Up a pawn (+1.2 eval)
Confidence: 65%
Information: I = 1 (seen similar)
Decision: Search deeper (State 3)
Rate limiters: R = 0.6
Search depth: 3 plies
Result: Finds tactical move
Move 25 (Endgame):
Position: Up a rook (+5.0 eval)
Confidence: 95%
Information: I = 1
Decision: Execute immediately (State 1)
Result: Simple winning move, fast
Move 30:
Position: Two pawns up (+2.2 eval)
Confidence: 82%
Decision: Execute immediately
Result: Push passed pawn
Move 40:
Position: Unclear endgame (+0.5 eval)
Confidence: 60%
Information: I = 1
Decision: Search deeper (State 3)
Rate limiters: R = 0.8 (time plenty, critical position)
Search depth: 6 plies
Result: Finds precise winning sequence
Transposition table grows:
Game 1: 50 positions stored
Game 10: 500 positions stored
Game 100: 5,000 positions stored
Game 1000: 50,000 positions stored
Effect:
Meta-learning:
def adjust_confidence_threshold(self):
"""
Learn optimal confidence threshold over time
"""
# Start at 2.0
threshold = 2.0
# After N games, analyze:
wins_when_confident = count_wins(eval >= threshold)
total_confident = count_games(eval >= threshold)
win_rate = wins_when_confident / total_confident
# Adjust threshold
if win_rate > 0.85:
threshold -= 0.2 # Lower threshold (too conservative)
elif win_rate < 0.75:
threshold += 0.2 # Raise threshold (too aggressive)
return threshold
Input: Chess position
Output: Best move
Method:
1. Evaluate position (material + basic factors)
2. IF eval >= +2.0:
EXECUTE IMMEDIATELY (State 1)
Return move that maintains advantage
3. ELSE IF position never seen:
RANDOMIZE (State 2)
Return random legal move
4. ELSE:
SEARCH WITH RATE LIMITERS (State 3)
Calculate R = f(economic, objective, W, topology)
Search depth = adaptive based on R
Return best move from alpha-beta
Rate limiters (State 3 only):
Data structures:
That’s it. Complete spec in ~150 lines.
From Post 509:
From Post 857:
Result:
The formula:
Chess move = {
IF confident: execute_immediately(),
ELIF ignorant: randomize(),
ELSE: search_with_rate_limiters()
}
Where:
confident = eval >= 2.0
ignorant = position not in transposition_table
rate_limiters = f(economic, objective, W, topology)
Minimal sufficient structure. Nothing simpler works as well.
∞
References:
Created: 2026-02-17
Status: ♟️ Minimal chess solver spec
∞