"""Static count from the inspected original ESRGAN author reference code.

This does not load weights, run inference, profile hardware, or establish X.
Source: https://raw.githubusercontent.com/xinntao/ESRGAN/master/RRDBNet_arch.py
Instantiation: test.py, RRDBNet(3, 3, 64, 23, gc=32).
Master inspected 2026-09-29; not pinned to a repository commit.
"""
import json
from pathlib import Path

def count(side):
    layers = []
    def conv(name, cin, cout, spatial):
        weights = 9 * cin * cout
        layers.append(dict(name=name, parameters=weights+cout,
                           macs=weights*spatial*spatial))
    conv('input', 3, 64, side)
    for rrdb in range(23):
        for rdb in range(3):
            for i, (cin, cout) in enumerate([(64,32),(96,32),(128,32),(160,32),(192,64)]):
                conv(f'RRDB{rrdb}.RDB{rdb}.conv{i}', cin, cout, side)
    conv('trunk', 64, 64, side)
    conv('up1', 64, 64, side*2)
    conv('up2', 64, 64, side*4)
    conv('HR', 64, 64, side*4)
    conv('output', 64, 3, side*4)
    return dict(input_side=side, output_side=side*4,
                convolution_layers=len(layers),
                parameters=sum(x['parameters'] for x in layers),
                convolution_MACs=sum(x['macs'] for x in layers))

if __name__ == '__main__':
    a, b = count(512), count(1024)
    existing=json.loads(Path(__file__).with_name('esrgan-architecture-count.json').read_text())
    assert a['parameters']==existing['parameters_including_biases']
    assert a['convolution_MACs']==existing['convolution_MACs']
    assert a['parameters']==b['parameters']
    assert b['convolution_MACs']==4*a['convolution_MACs']
    print(json.dumps({'512_input':a, '1024_input':b,
                      'execution':'Static arithmetic only; no model execution'},indent=2))
