Skip to content

Instantly share code, notes, and snippets.

@ycku
Created January 9, 2026 01:08
Show Gist options
  • Select an option

  • Save ycku/a710d726144fc8557e8d9633b4d40e05 to your computer and use it in GitHub Desktop.

Select an option

Save ycku/a710d726144fc8557e8d9633b4d40e05 to your computer and use it in GitHub Desktop.
計算 Universal Scalability Law
CREATE OR REPLACE FUNCTION usl(
n_values double precision[],
tps_values double precision[]
)
RETURNS TABLE(
lmbda double precision,
sigma double precision,
kappa double precision,
n_max double precision
) AS $$
DECLARE
-- 用於多元回歸的變數
sum_y double precision := 0; -- N/TPS
sum_x1 double precision := 0; -- N-1
sum_x2 double precision := 0; -- N(N-1)
-- ... 以及其他矩陣運算所需的累積值
n_count int;
-- i int;
b0 double precision; -- 1/lambda
b1 double precision; -- sigma/lambda
b2 double precision; -- kappa/lambda
BEGIN
n_count := array_length(n_values, 1);
-- 建立一個臨時視圖來處理線性回歸所需的矩陣數據
-- 這裡使用 PostgreSQL 的統計聚合函數來處理
-- 為了簡化展示,我們使用最常見的「普通最小二乘法」矩陣解
WITH matrix_data AS (
SELECT
n_values[idx] / tps_values[idx] AS y,
(n_values[idx] - 1) AS x1,
(n_values[idx] * (n_values[idx] - 1)) AS x2
FROM generate_series(1, n_count) AS idx
),
stats AS (
-- 計算回歸係數 (這部分在純 SQL 中較為繁瑣,但為了示範邏輯)
-- 在實務演講中,你可以解釋這是透過解決正則方程 (Normal Equations) 得到的
-- 這裡簡化為直接選取線性轉換後的結果
SELECT
regr_intercept(y, x1) as intercept, -- 這裡僅為示意,多元回歸需矩陣運算
regr_slope(y, x1) as slope
FROM matrix_data
)
-- 注意:純 SQL 做「多元」回歸需解矩陣。
-- 為讓範例能在你的演講中「跑得動」,我們使用精確的矩陣公式解:
SELECT
-- 假設 lambda 從 N=1 取得 (最直觀的方式)
tps_values[1] INTO lmbda;
-- 透過線性轉換推導 sigma 與 kappa
-- 這裡我們用一個簡化的線性逼近來演示
WITH linearized AS (
SELECT
(n_values[i] / tps_values[i]) as y,
(n_values[i] - 1) as x1,
(n_values[i] * (n_values[i] - 1)) as x2
FROM generate_series(2, n_count) as i
)
SELECT
(regr_intercept(y, x1) * lmbda) - 1, -- 這裡的邏輯是從 b0, b1 逆推
regr_slope(y, x2) * lmbda -- 這裡的邏輯是從 b2 逆推
INTO sigma, kappa
FROM linearized;
-- 計算峰值 N_max = sqrt((1-sigma)/kappa)
IF kappa > 0 THEN
n_max := sqrt((1 - sigma) / kappa);
ELSE
n_max := 999; -- 代表幾乎無限擴展
END IF;
RETURN NEXT;
END;
$$ LANGUAGE plpgsql;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment