Skip to content

Commit b4c522c

Browse files
committed
wip
1 parent 0fac42c commit b4c522c

File tree

5 files changed

+282
-44
lines changed

5 files changed

+282
-44
lines changed

_posts/creative_writing/2025-12-04-comicbookgeneration-20251204162502.md

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,32 @@ is_gateway: true
7979
is_synthesis: true
8080
---
8181

82+
![Page 1 Row 1](../../assets/images/dates/page_1_row_1.png)
83+
84+
![Page 1 Row 2](../../assets/images/dates/page_1_row_2.png)
85+
86+
![Page 1 Row 3](../../assets/images/dates/page_1_row_3.png)
87+
88+
![Page 2 Row 1](../../assets/images/dates/page_2_row_1.png)
89+
90+
![Page 2 Row 2](../../assets/images/dates/page_2_row_2.png)
91+
92+
![Page 2 Row 3](../../assets/images/dates/page_2_row_3.png)
93+
94+
![Page 3 Row 1](../../assets/images/dates/page_3_row_1.png)
95+
96+
![Page 3 Row 2](../../assets/images/dates/page_3_row_2.png)
97+
98+
![Page 3 Row 3](../../assets/images/dates/page_3_row_3.png)
99+
100+
![Page 4 Row 1](../../assets/images/dates/page_4_row_1.png)
101+
102+
![Page 4 Row 2](../../assets/images/dates/page_4_row_2.png)
103+
104+
![Page 4 Row 3](../../assets/images/dates/page_4_row_3.png)
105+
106+
![Page 4 Row 4](../../assets/images/dates/page_4_row_4.png)
107+
82108

83109
# Comic Book Generation Task
84110

@@ -188,30 +214,3 @@ is_synthesis: true
188214
![CHLOE](../../assets/images/dates/char_CHLOE.png)
189215

190216
*The Date. Curated casual personality who speaks exclusively in therapy-speak and TikTok trends.*
191-
192-
![Page 1 Row 1](../../assets/images/dates/page_1_row_1.png)
193-
194-
![Page 1 Row 2](../../assets/images/dates/page_1_row_2.png)
195-
196-
![Page 1 Row 3](../../assets/images/dates/page_1_row_3.png)
197-
198-
![Page 2 Row 1](../../assets/images/dates/page_2_row_1.png)
199-
200-
![Page 2 Row 2](../../assets/images/dates/page_2_row_2.png)
201-
202-
![Page 2 Row 3](../../assets/images/dates/page_2_row_3.png)
203-
204-
![Page 3 Row 1](../../assets/images/dates/page_3_row_1.png)
205-
206-
![Page 3 Row 2](../../assets/images/dates/page_3_row_2.png)
207-
208-
![Page 3 Row 3](../../assets/images/dates/page_3_row_3.png)
209-
210-
![Page 4 Row 1](../../assets/images/dates/page_4_row_1.png)
211-
212-
![Page 4 Row 2](../../assets/images/dates/page_4_row_2.png)
213-
214-
![Page 4 Row 3](../../assets/images/dates/page_4_row_3.png)
215-
216-
![Page 4 Row 4](../../assets/images/dates/page_4_row_4.png)
217-

assets/2025-06-30-knots-lab.html

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,14 @@ <h1>
519519

520520
<div class="panel-header">Optimization</div>
521521

522+
<div class="control-group">
523+
<label>Optimizer</label>
524+
<select id="opt-optimizer">
525+
<option value="adam">Adam</option>
526+
<option value="qqn">QQN</option>
527+
<option value="lbfgs">L-BFGS</option>
528+
</select>
529+
</div>
522530
<div class="control-group">
523531
<label>Learning Rate <input type="number" class="value-input" id="val-lr" value="0.01" step="0.001"></label>
524532
<input type="range" id="param-lr" min="0.001" max="0.1" step="0.001" value="0.01">
@@ -616,7 +624,11 @@ <h1>
616624
</div>
617625
</main>
618626

619-
<script>
627+
<script type="module">
628+
import {OptimizerLbfgs} from './js/optimizer-lbfgs.js';
629+
import {OptimizerAdam} from './js/optimizer-adam.js';
630+
import {OptimizerQQN} from './js/optimizer-qqn.js';
631+
620632
/**
621633
* Knot Topology Lab
622634
*
@@ -650,7 +662,8 @@ <h1>
650662
lr: 0.01,
651663
c: 1.0,
652664
knotType: 'random',
653-
metricMode: 'euclidean'
665+
metricMode: 'euclidean',
666+
optimizerType: 'adam'
654667
},
655668
metrics: {
656669
totalLoss: 0,
@@ -669,6 +682,7 @@ <h1>
669682
matrixCanvas: document.getElementById('matrix-canvas'),
670683
loading: document.getElementById('loading'),
671684
knotSelect: document.getElementById('knot-select'),
685+
optimizerSelect: document.getElementById('opt-optimizer'),
672686
metricSelect: document.getElementById('metric-select'),
673687
grpC: document.getElementById('grp-c'),
674688
cInput: document.getElementById('param-c'),
@@ -713,6 +727,15 @@ <h1>
713727

714728
const knotCtx = els.knotCanvas.getContext('2d');
715729
const matrixCtx = els.matrixCanvas.getContext('2d');
730+
function createOptimizer() {
731+
if (state.params.optimizerType === 'adam') {
732+
return new OptimizerAdam(state.params.lr);
733+
} else if (state.params.optimizerType === 'qqn') {
734+
return new OptimizerQQN(state.params.lr);
735+
}
736+
return new OptimizerLbfgs(state.params.lr);
737+
}
738+
716739

717740
// --- Spline Generation ---
718741

@@ -875,7 +898,7 @@ <h1>
875898
state.points.dispose();
876899
state.points = tf.variable(tf.tensor2d(newPoints));
877900
// Reset optimizer to clear history
878-
state.optimizer = tf.train.adam(state.params.lr);
901+
state.optimizer = createOptimizer();
879902
updateDistanceMatrix();
880903
}
881904
/**
@@ -909,7 +932,7 @@ <h1>
909932
state.points = tf.variable(tf.tensor2d(pointsArray));
910933

911934
// Reset optimizer
912-
state.optimizer = tf.train.adam(state.params.lr);
935+
state.optimizer = createOptimizer();
913936
state.step = 0;
914937
}
915938

@@ -1047,7 +1070,7 @@ <h1>
10471070
if (!state.points) return;
10481071

10491072
const lossInfo = tf.tidy(() => {
1050-
const {value, grads} = tf.variableGrads(() => {
1073+
const lossFunction = () => {
10511074
const edgeLoss = computeEdgeLoss(
10521075
state.points,
10531076
state.params.targetEdgeLength,
@@ -1059,9 +1082,10 @@ <h1>
10591082
state.params.repulsionCutoff
10601083
);
10611084
return tf.add(edgeLoss, repulsionLoss);
1062-
});
1085+
};
10631086

1064-
state.optimizer.applyGradients(grads);
1087+
const {value, grads} = state.optimizer.computeGradients(lossFunction);
1088+
state.optimizer.applyGradients(grads, lossFunction);
10651089

10661090
// Compute individual losses for display
10671091
const edgeLoss = computeEdgeLoss(
@@ -1722,9 +1746,18 @@ <h1>
17221746
updateDistanceMatrix();
17231747
}
17241748
});
1749+
els.optimizerSelect.addEventListener('change', (e) => {
1750+
state.params.optimizerType = e.target.value;
1751+
state.optimizer = createOptimizer();
1752+
});
1753+
17251754

17261755
els.lrInput.addEventListener('input', () => {
1727-
state.optimizer = tf.train.adam(state.params.lr);
1756+
if (state.optimizer && typeof state.optimizer.setLearningRate === 'function') {
1757+
state.optimizer.setLearningRate(state.params.lr);
1758+
} else {
1759+
state.optimizer = createOptimizer();
1760+
}
17281761
});
17291762

17301763
els.chkAutoRotate.addEventListener('change', (e) => {
@@ -1790,7 +1823,7 @@ <h1>
17901823
state.params.n = data.length;
17911824
els.valN.value = data.length;
17921825
els.nInput.value = data.length;
1793-
state.optimizer = tf.train.adam(state.params.lr);
1826+
state.optimizer = createOptimizer();
17941827
state.step = 0;
17951828
updateDistanceMatrix();
17961829
const original = els.btnPaste.textContent;

assets/2025-11-27-geometric-entropy.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ <h1>
479479
<label>Optimizer</label>
480480
<select id="opt-optimizer">
481481
<option value="adam">Adam</option>
482+
<option value="qqn">QQN</option>
482483
<option value="lbfgs">L-BFGS</option>
483484
</select>
484485
</div>
@@ -573,6 +574,7 @@ <h1>
573574
<script type="module">
574575
import {OptimizerLbfgs} from './js/optimizer-lbfgs.js';
575576
import {OptimizerAdam} from './js/optimizer-adam.js';
577+
import {OptimizerQQN} from './js/optimizer-qqn.js';
576578

577579
/**
578580
* Spherical Gram Entropy - Interactive Demo
@@ -1408,6 +1410,8 @@ <h1>
14081410
function createOptimizer() {
14091411
if (state.params.optimizerType === 'adam') {
14101412
return new OptimizerAdam(state.params.lr);
1413+
} else if (state.params.optimizerType === 'qqn') {
1414+
return new OptimizerQQN(state.params.lr);
14111415
}
14121416
return new OptimizerLbfgs(state.params.lr);
14131417
}

assets/2025-11-27-measures.html

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,7 @@ <h1>
832832
</label>
833833
<select id="opt-optimizer">
834834
<option value="lbfgs">L-BFGS</option>
835+
<option value="qqn">QQN</option>
835836
<option value="adam">Adam</option>
836837
</select>
837838
</div>
@@ -895,6 +896,7 @@ <h1>
895896
<script type="module">
896897
import {OptimizerLbfgs} from './js/optimizer-lbfgs.js';
897898
import {OptimizerAdam} from './js/optimizer-adam.js';
899+
import {OptimizerQQN} from './js/optimizer-qqn.js';
898900

899901
/**
900902
* Interpolated Density Entropy - Interactive Demo
@@ -1081,7 +1083,7 @@ <h1>
10811083
return;
10821084
}
10831085

1084-
state.optimizer.applyGradients(grads);
1086+
state.optimizer.applyGradients(grads, lossFunction);
10851087

10861088
// Update metrics for UI (syncing small scalars is cheap)
10871089
const stats = getDensityStats(effectivePoints, state.params.tau);
@@ -1122,13 +1124,19 @@ <h1>
11221124
const sortedPoints = Float32Array.from(pointsArr).sort();
11231125

11241126
// Determine scale
1125-
// We want to keep the view somewhat centered but dynamic
1126-
const minVal = Math.min(...sortedPoints);
1127-
const maxVal = Math.max(...sortedPoints);
1128-
const spread = Math.max(maxVal - minVal, 4.0); // Minimum spread of 4
1129-
const padding = spread * 0.1;
1130-
const viewMin = minVal - padding;
1131-
const viewMax = maxVal + padding;
1127+
let viewMin, viewMax;
1128+
if (state.params.fixBoundaries) {
1129+
viewMin = -0.1;
1130+
viewMax = 1.1;
1131+
} else {
1132+
// We want to keep the view somewhat centered but dynamic
1133+
const minVal = Math.min(...sortedPoints);
1134+
const maxVal = Math.max(...sortedPoints);
1135+
const spread = Math.max(maxVal - minVal, 4.0); // Minimum spread of 4
1136+
const padding = spread * 0.1;
1137+
viewMin = minVal - padding;
1138+
viewMax = maxVal + padding;
1139+
}
11321140

11331141
const mapX = (val) => {
11341142
return ((val - viewMin) / (viewMax - viewMin)) * (width - 40) + 20;
@@ -1232,6 +1240,8 @@ <h1>
12321240
function createOptimizer() {
12331241
if (state.params.optimizerType === 'adam') {
12341242
return new OptimizerAdam(state.params.lr);
1243+
} else if (state.params.optimizerType === 'qqn') {
1244+
return new OptimizerQQN(state.params.lr);
12351245
}
12361246
return new OptimizerLbfgs(state.params.lr);
12371247
}

0 commit comments

Comments
 (0)