Function Families and Growth Analysis
This guide covers how to work with function families - parameterized collections of Boolean functions that grow with n.
What is a Function Family?
A function family is a sequence of Boolean functions indexed by the number of variables n:
Majority_n: Returns 1 if more than half of inputs are 1
Parity_n: XOR of all inputs
Tribes_{k,n}: OR of k groups, each an AND of n/k variables
AND_n / OR_n: All inputs must be 1 / at least one input must be 1
Studying how properties change as n grows reveals asymptotic behavior and theoretical bounds.
Built-in Families
from boofun.families import (
MajorityFamily,
ParityFamily,
TribesFamily,
ANDFamily,
ORFamily,
DictatorFamily,
ThresholdFamily,
LTFFamily,
RecursiveMajority3Family,
)
# Generate a specific instance
maj = MajorityFamily()
f_5 = maj.generate(5) # Majority on 5 variables
f_7 = maj(7) # Shorthand
# Generate multiple
functions = maj.generate_range([3, 5, 7, 9, 11])
Family Metadata
Each family has metadata about its properties:
maj = MajorityFamily()
meta = maj.metadata
print(meta.name) # "Majority"
print(meta.description) # "MAJ_n(x) = 1 if Σx_i > n/2"
print(meta.asymptotics) # Known theoretical formulas
print(meta.universal_properties) # ["monotone", "symmetric", "balanced"]
Theoretical Values
Get theoretical predictions for properties:
# Total influence of Majority_n ≈ √(2/π) · √n
theory = maj.theoretical_value('total_influence', n=15)
print(f"I[MAJ_15] ≈ {theory:.4f}") # ≈ 3.09
Tracking Growth
The GrowthTracker observes properties as n increases:
from boofun.families import GrowthTracker, MajorityFamily
# Create tracker
maj = MajorityFamily()
tracker = GrowthTracker(maj)
# Mark properties to track
tracker.mark('total_influence')
tracker.mark('noise_stability', rho=0.9)
tracker.mark('expectation')
tracker.mark('variance')
# Observe over range of n
results = tracker.observe(n_values=[3, 5, 7, 9, 11, 13, 15])
# Get summary
print(tracker.summary())
Available Markers
from boofun.families import PropertyMarker
# Built-in markers
tracker.mark('total_influence')
tracker.mark('influences') # All variable influences
tracker.mark('influence_0') # Specific variable
tracker.mark('noise_stability', rho=0.5)
tracker.mark('fourier_degree')
tracker.mark('spectral_concentration', k=2)
tracker.mark('expectation')
tracker.mark('variance')
tracker.mark('sensitivity')
tracker.mark('block_sensitivity')
tracker.mark('is_monotone') # Boolean properties
# Custom marker
tracker.mark('custom',
compute_fn=lambda f: f.sparsity(),
description="Fourier sparsity")
Visualization
Single Family Growth
from boofun.visualization.growth_plots import GrowthVisualizer
viz = GrowthVisualizer()
# Plot with theoretical comparison
fig, ax = viz.plot_growth(
tracker,
'total_influence',
show_theory=True,
log_y=False
)
Family Comparison
Compare multiple families on the same property:
from boofun.families import MajorityFamily, ParityFamily, ANDFamily
# Track each family
families = {
'Majority': MajorityFamily(),
'Parity': ParityFamily(),
'AND': ANDFamily(),
}
trackers = {}
for name, family in families.items():
tracker = GrowthTracker(family)
tracker.mark('total_influence')
tracker.observe(n_values=list(range(3, 12)))
trackers[name] = tracker
# Compare
viz = GrowthVisualizer()
fig = viz.plot_family_comparison(
trackers,
'total_influence',
log_y=True,
title="Total Influence: Parity vs Majority vs AND"
)
Convergence Rate
Analyze how a property converges to its asymptotic value:
fig = viz.plot_convergence_rate(
tracker,
'total_influence',
reference='sqrt_n' # Divide by √n to see constant factor
)
Custom Families
From a Generator Function
from boofun.families import FunctionFamily, FamilyMetadata
import boofun as bf
class MyCustomFamily(FunctionFamily):
@property
def metadata(self):
return FamilyMetadata(
name="MyFunction",
description="Custom function family",
asymptotics={
'total_influence': lambda n: n * 0.5,
},
universal_properties=['balanced'],
)
def generate(self, n, **kwargs):
# Your custom logic
return bf.majority(n) ^ bf.parity(n)
Inductive Families
Define families recursively:
from boofun.families import InductiveFamily
class RecursiveFamily(InductiveFamily):
def __init__(self):
super().__init__(
name="Recursive",
base_cases={1: bf.dictator(1, 0)},
step_size=1
)
def step(self, f_prev, n, n_prev):
# Extend from n-1 to n variables
return f_prev.extend(n, fill=0)
Weight Pattern LTFs
LTF families with custom weight patterns:
from boofun.families import LTFFamily
# Geometric weights: w_i = 0.5^i
geometric = LTFFamily.geometric(ratio=0.5)
# Harmonic weights: w_i = 1/(i+1)
harmonic = LTFFamily.harmonic()
# Power-law weights: w_i = (n-i)^2
power = LTFFamily.power_law(power=2.0)
# Custom pattern
custom = LTFFamily(
weight_pattern=lambda i, n: 1.0 / (i + 1)**0.5,
name="SqrtHarmonic"
)
Theoretical Bounds
The library includes known asymptotic formulas:
Family |
Total Influence |
Max Influence |
Noise Stability |
|---|---|---|---|
Majority_n |
√(2/π) · √n |
√(2/(πn)) |
(1/2) + (1/π)arcsin(ρ) |
Parity_n |
n |
1 |
ρ^n |
AND_n |
n · 2^{-(n-1)} |
2^{-(n-1)} |
- |
Tribes |
O(log n) |
O(log n / n) |
- |
Dictator |
1 |
1 |
ρ |
Access these via:
maj = MajorityFamily()
print(maj.metadata.asymptotics)
Quick Growth Plot
For quick exploration:
from boofun.visualization.growth_plots import quick_growth_plot
# One-liner visualization
fig = quick_growth_plot(
'majority',
properties=['total_influence', 'expectation'],
n_values=[3, 5, 7, 9, 11, 13]
)
See Also
Spectral Analysis Guide - Fourier analysis fundamentals
Query Complexity Guide - Complexity measures
API Reference - Full API documentation