Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
84ce9e2
Increase holomorphic coefficient budget for visual experiment
isomorphisms Sep 9, 2026
2fe4c24
Move holomorphic deformation into GPU Cauchy field
isomorphisms Sep 9, 2026
0b495fe
Replace CPU holomorphic walk with time-driven GPU field
isomorphisms Sep 9, 2026
3e01420
Remove holomorphic walk from native build
isomorphisms Sep 9, 2026
83040e9
Delete retired CPU holomorphic walk
isomorphisms Sep 9, 2026
58585f4
Delete retired CPU holomorphic walk header
isomorphisms Sep 9, 2026
ce28283
Delete retired holomorphic walk test
isomorphisms Sep 9, 2026
ea1c462
Retarget CI from CPU walk to GPU Cauchy field
isomorphisms Sep 9, 2026
f0138c1
Add Cauchy field architecture acceptance
isomorphisms Sep 9, 2026
33b6139
Add wandering offscreen poles to the live portrait
isomorphisms Sep 9, 2026
8219da2
Fix Cauchy field EGL surface initialization
isomorphisms Sep 9, 2026
5f9a083
Update Wegert boundary test for GPU Cauchy field
isomorphisms Sep 9, 2026
8fb0658
Retarget Play validation to GPU Cauchy field
isomorphisms Sep 9, 2026
ccde90c
Retarget APK acceptance to GPU Cauchy field
isomorphisms Sep 9, 2026
a344d49
Retarget native APK release checks to Cauchy field
isomorphisms Sep 9, 2026
4d86e56
Document visible-region Cauchy-field semantics
isomorphisms Sep 9, 2026
c4517a2
Align mathematical contract with Cauchy-field branch
isomorphisms Sep 9, 2026
2856e7e
Allow negative checks for retired worker test
isomorphisms Sep 9, 2026
c73ffd0
Strengthen Cauchy soup from runtime evidence
isomorphisms Sep 9, 2026
0df563a
Add reusable live-motion acceptance check
isomorphisms Sep 9, 2026
28907f0
Fix live Cauchy motion acceptance harness
isomorphisms Sep 9, 2026
3a3c3e2
Record runtime-tuned Cauchy weights
isomorphisms Sep 9, 2026
bad9ff0
Cancel superseded Cauchy APK checks
isomorphisms Sep 9, 2026
0fc982f
Increase remote pole wander for stronger lava-lamp motion
isomorphisms Sep 9, 2026
83c62f6
Strengthen runtime rendering acceptance
isomorphisms Sep 9, 2026
68e9601
Test Cauchy field motion before divisor rendering
isomorphisms Sep 9, 2026
0bc0a3e
Add repeated-root runtime fixture
isomorphisms Sep 9, 2026
3c623c3
Make Cauchy motion check region aware
isomorphisms Sep 9, 2026
a9a25d8
Test Cauchy motion under repeated roots
isomorphisms Sep 9, 2026
dc6a892
Fix repeated-root evidence upload action
isomorphisms Sep 9, 2026
48f01e1
Seed repeated zeros without drag fixture
isomorphisms Sep 9, 2026
d86dcd2
Retry repeated-root motion without drag
isomorphisms Sep 9, 2026
0025ca3
Clarify clean presentation capture requirements
isomorphisms Sep 9, 2026
882efc2
Document Mumford-inspired structure acceptance
isomorphisms Sep 9, 2026
198b79f
Expand wandering remote poles procedurally
isomorphisms Sep 9, 2026
1a3da1b
Move wandering remote poles farther out
isomorphisms Sep 9, 2026
d2d8efd
Add multiscale structure-motion acceptance
isomorphisms Sep 9, 2026
ff8ff4c
Gate repeated-root motion on coarse structure
isomorphisms Sep 9, 2026
6fd7196
Check coarse structure in ordinary APK motion
isomorphisms Sep 9, 2026
4a533de
Temporarily stage smooth orbit patch
isomorphisms Sep 9, 2026
0247f35
Fix temporary orbit patch workflow
isomorphisms Sep 9, 2026
35c6254
Give remote poles smooth orbital paths
Sep 9, 2026
3485a11
Trigger orbit APK validation
isomorphisms Sep 9, 2026
2580528
Remove orbit build trigger
isomorphisms Sep 9, 2026
856e7ca
Record calibrated Mumford structure-motion test
isomorphisms Sep 9, 2026
0cdb8dd
Add Mumford vision paper source trail
isomorphisms Sep 9, 2026
6b9bb88
Keep Mumford note focused on structure theory
isomorphisms Sep 9, 2026
367557f
Stage canonical smooth-orbit acceptance cleanup
isomorphisms Sep 9, 2026
625ccce
Align holomorphic APK acceptance with canonical smooth orbits
isomorphisms Sep 9, 2026
a3de492
Align release acceptance with continuous smooth orbit experience
isomorphisms Sep 9, 2026
076994e
Remove temporary smooth-orbit promotion workflow
isomorphisms Sep 9, 2026
b9d5d13
Drop stale worker-step logging from release emulator gate
isomorphisms Sep 9, 2026
c690eb2
Use visual motion instead of stale worker-step logs
isomorphisms Sep 9, 2026
dc04221
Preserve versioned APK artifact paths
isomorphisms Sep 9, 2026
965bd87
Drop stale worker-step logging from Android emulator gate
isomorphisms Sep 9, 2026
d333aab
Run visual motion comparison as one emulator command
isomorphisms Sep 9, 2026
e0c5e77
Make smooth orbital pole motion the canonical explorer experience (#48)
isomorphisms Sep 9, 2026
0c5b7d2
Name the production app Holomorphic
isomorphisms Sep 9, 2026
37a6cef
Bring Cauchy field onto current Holomorphic main
isomorphisms Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 5 additions & 17 deletions .github/workflows/google-play.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,6 @@ jobs:
- name: Install native Android toolchain
run: sdkmanager "platforms;android-36" "build-tools;36.0.0" "ndk;29.0.14206865" "cmake;3.22.1"

- name: Test the active holomorphic worker
run: |
cc -std=c11 -Wall -Wextra -Werror \
-Iandroid/app/src/main/cpp \
tests/test_holomorphic_walk.c \
android/app/src/main/cpp/holomorphic_walk.c \
-pthread -lm \
-o /tmp/test-holomorphic-walk
/tmp/test-holomorphic-walk

- name: Create disposable validation key
run: |
keytool -genkeypair -noprompt \
Expand Down Expand Up @@ -134,7 +124,7 @@ jobs:
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Launch and touch the random holomorphic explorer
- name: Launch and touch the Cauchy-field explorer
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 34
Expand All @@ -152,18 +142,16 @@ jobs:
adb logcat -d > analytic-continuation-emulator.log
adb exec-out screencap -p > analytic-continuation-emulator.png
adb shell pidof -s org.isomorphisms.analyticcontinuation.lasso.dev | tr -d '\r' | grep -Eq '^[0-9]+$'
grep -Fq 'holomorphic field started with 3 workers' analytic-continuation-emulator.log
grep -Fq 'holomorphic field ready:' analytic-continuation-emulator.log
grep -Fq 'Cauchy field ready:' analytic-continuation-emulator.log
grep -Fq 'zeros=1 poles=1' analytic-continuation-emulator.log
grep -Fq 'holomorphic field first frame:' analytic-continuation-emulator.log
steps=$(sed -n 's/.*holomorphic field: workers=3 steps=\([0-9][0-9]*\).*/\1/p' analytic-continuation-emulator.log | tail -1); test -n "$steps"; test "$steps" -gt 0
set -- $(sed -n 's/.*holomorphic field ready: surface=\([0-9][0-9]*\)x\([0-9][0-9]*\).*/\1 \2/p' analytic-continuation-emulator.log | tail -1); width=$1; height=$2; min_side=$width; if [ "$height" -lt "$width" ]; then min_side=$height; fi; pixel_radius=$((42 * min_side / 100)); adb shell input tap "$((width / 2 + pixel_radius / 2))" "$((height / 2 + pixel_radius / 4))"
grep -Fq 'Cauchy field first frame:' analytic-continuation-emulator.log
set -- $(sed -n 's/.*Cauchy field ready: surface=\([0-9][0-9]*\)x\([0-9][0-9]*\).*/\1 \2/p' analytic-continuation-emulator.log | tail -1); width=$1; height=$2; min_side=$width; if [ "$height" -lt "$width" ]; then min_side=$height; fi; pixel_radius=$((42 * min_side / 100)); adb shell input tap "$((width / 2 + pixel_radius / 2))" "$((height / 2 + pixel_radius / 4))"
sleep 1
adb logcat -d > analytic-continuation-emulator.log
adb exec-out screencap -p > analytic-continuation-emulator.png
grep -Fq 'zero added:' analytic-continuation-emulator.log
grep -Fq 'count=2' analytic-continuation-emulator.log
! grep -Eiq 'shader compilation failed|program link failed|eglInitialize failed|could not choose GLES3 EGL config|could not create EGL surface/context|eglMakeCurrent failed|holomorphic field shader uniforms unavailable|FATAL EXCEPTION' analytic-continuation-emulator.log
! grep -Eiq 'shader compilation failed|program link failed|eglInitialize failed|could not choose GLES3 EGL config|could not create EGL surface/context|eglMakeCurrent failed|Cauchy field shader uniforms unavailable|FATAL EXCEPTION' analytic-continuation-emulator.log

- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: always()
Expand Down
93 changes: 30 additions & 63 deletions .github/workflows/holomorphic-apk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
- main
paths:
- 'android/**'
- 'tests/test_holomorphic_walk.c'
- 'tests/**'
- '.github/workflows/holomorphic-apk.yml'
workflow_dispatch:

Expand All @@ -15,7 +15,7 @@ permissions:

concurrency:
group: holomorphic-apk-${{ github.ref }}
cancel-in-progress: false
cancel-in-progress: true

jobs:
build:
Expand All @@ -34,38 +34,33 @@ jobs:
- name: Install native Android toolchain
run: sdkmanager "platforms;android-36" "build-tools;36.0.0" "ndk;29.0.14206865" "cmake;3.22.1"

- name: Verify random holomorphic architecture
- name: Verify GPU Cauchy-field architecture
run: |
grep -Fq '#define HOLOMORPHIC_WALK_WORKER_COUNT 3' android/app/src/main/cpp/holomorphic_walk.h
grep -Fq '#define HOLOMORPHIC_WALK_COEFFICIENT_BUDGET 1.20f' android/app/src/main/cpp/holomorphic_walk.h
grep -Fq '#define SEARCH_CANDIDATES 128' android/app/src/main/cpp/holomorphic_walk.c
grep -Fq 'Re(delta_q) and Im(delta_q) are log-modulus/phase sensitivities' android/app/src/main/cpp/holomorphic_walk.c
grep -Fq 'holomorphic_walk_best_direction' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'const float speed = 0.30f;' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'APP_CMD_LOST_FOCUS' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'PLACEMENT_POLE' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'HOLOMORPHIC_WALK_COEFFICIENT_BUDGET' android/app/src/main/cpp/analytic_continuation_random.c
! grep -Fq 'pause_control_contains' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'u_holomorphic_coefficients' android/app/src/main/assets/continuation.frag.in
grep -Fq 'vec2 u = z / 3.0;' android/app/src/main/assets/continuation.frag.in
test ! -e android/app/src/main/cpp/holomorphic_walk.c
test ! -e android/app/src/main/cpp/holomorphic_walk.h
test ! -e tests/test_holomorphic_walk.c
grep -Fq 'GLint time_location;' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'glGetUniformLocation(engine->program, "u_time")' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'glUniform1f(engine->time_location, animation_time);' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'if (zoom < 0.1f) zoom = 0.1f;' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq 'if (zoom > 32.0f) zoom = 32.0f;' android/app/src/main/cpp/analytic_continuation_random.c
grep -Fq '#define SOURCE_COUNT 24' android/app/src/main/assets/continuation.frag.in
grep -Fq 'uniform float u_time;' android/app/src/main/assets/continuation.frag.in
grep -Fq 'vec2 source_position' android/app/src/main/assets/continuation.frag.in
grep -Fq 'vec2 source_weight' android/app/src/main/assets/continuation.frag.in
grep -Fq 'vec2 holomorphic_field' android/app/src/main/assets/continuation.frag.in
grep -Fq 'float base = 1.8 * view_radius;' android/app/src/main/assets/continuation.frag.in
grep -Fq 'float radial = 0.35 * view_radius' android/app/src/main/assets/continuation.frag.in
grep -Fq 'vec2 q = holomorphic_field(z, u_time, view_radius);' android/app/src/main/assets/continuation.frag.in
grep -Fq 'log_modulus += q.x;' android/app/src/main/assets/continuation.frag.in
grep -Fq 'phase += q.y;' android/app/src/main/assets/continuation.frag.in
grep -Fq 'vec3 color = wegert_color_from_phase_log_modulus(phase, log_modulus);' android/app/src/main/assets/continuation.frag.in
! grep -RniE 'holomorphic_walk|u_holomorphic_coefficients|deformation_velocity|coefficient_budget' android/app/src/main/cpp android/app/src/main/assets/continuation.frag.in
! grep -Fq 'u_paused' android/app/src/main/assets/continuation.frag.in
test ! -e android/app/src/main/cpp/analytic_continuation.c
! grep -RniE 'lasso_map|inverse_lasso|dragging_lasso|lasso_coefficients|continuation_path' android/app/src/main/cpp android/app/src/main/assets/continuation.frag.in

- name: Test direction search on host
run: |
cc -std=c11 -Wall -Wextra -Werror \
-Iandroid/app/src/main/cpp \
tests/test_holomorphic_walk.c \
android/app/src/main/cpp/holomorphic_walk.c \
-pthread -lm \
-o /tmp/test-holomorphic-walk
/tmp/test-holomorphic-walk

- name: Build holomorphic-random APK
- name: Build Cauchy-field APK
working-directory: android
run: ./gradlew --no-daemon :app:assembleDebug

Expand All @@ -85,6 +80,8 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 25
steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0

- uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0
with:
distribution: temurin
Expand All @@ -106,7 +103,7 @@ jobs:
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm

- name: Launch moving soup and exercise zero and pole editing
- name: Launch moving Cauchy soup and exercise zero and pole editing
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 34
Expand All @@ -123,53 +120,23 @@ jobs:
adb shell am start -W -n org.isomorphisms.analyticcontinuation.lasso.dev/org.isomorphisms.analyticcontinuation.ExplorerActivity
sleep 4
adb logcat -d > holomorphic-emulator.log
grep -Fq 'holomorphic field started with 3 workers' holomorphic-emulator.log
grep -Fq 'holomorphic field ready:' holomorphic-emulator.log
grep -Fq 'Cauchy field ready:' holomorphic-emulator.log
grep -Fq 'zeros=1 poles=1' holomorphic-emulator.log
grep -Fq 'holomorphic field first frame:' holomorphic-emulator.log
steps_before=$(sed -n 's/.*holomorphic field: workers=3 steps=\([0-9][0-9]*\).*/\1/p' holomorphic-emulator.log | tail -1); test -n "$steps_before"; test "$steps_before" -gt 0

grep -Fq 'Cauchy field first frame:' holomorphic-emulator.log
adb exec-out screencap -p > holomorphic-motion-a.png
sleep 6
adb exec-out screencap -p > holomorphic-motion-b.png
adb logcat -d > holomorphic-emulator.log
steps_after_motion=$(sed -n 's/.*holomorphic field: workers=3 steps=\([0-9][0-9]*\).*/\1/p' holomorphic-emulator.log | tail -1); test -n "$steps_after_motion"; test "$steps_after_motion" -gt "$steps_before"
python3 - <<'PY'
from PIL import Image, ImageChops, ImageStat

first = Image.open('holomorphic-motion-a.png').convert('RGB')
second = Image.open('holomorphic-motion-b.png').convert('RGB')
if first.size != second.size:
raise SystemExit('motion screenshots have different dimensions')

width, height = first.size
box = (
int(width * 0.10),
int(height * 0.15),
int(width * 0.90),
int(height * 0.85),
)
diff = ImageChops.difference(first.crop(box), second.crop(box))
mean = sum(ImageStat.Stat(diff).mean) / 3.0
pixels = list(diff.getdata())
changed = sum(1 for pixel in pixels if max(pixel) >= 8)
changed_fraction = changed / max(len(pixels), 1)
print(f'holomorphic motion mean_abs_rgb={mean:.3f} changed_fraction={changed_fraction:.3f}')
if mean < 1.5 or changed_fraction < 0.10:
raise SystemExit('holomorphic motion is still too visually weak')
PY

set -- $(sed -n 's/.*holomorphic field ready: surface=\([0-9][0-9]*\)x\([0-9][0-9]*\).*/\1 \2/p' holomorphic-emulator.log | tail -1); width=$1; height=$2; min_side=$width; if [ "$height" -lt "$width" ]; then min_side=$height; fi; placement_radius=$((48 * min_side / 1000)); if [ "$placement_radius" -lt 26 ]; then placement_radius=26; fi; if [ "$placement_radius" -gt 38 ]; then placement_radius=38; fi; zero_control_x=$((placement_radius + 16)); control_y=$((height - placement_radius - 16)); pole_control_x=$((zero_control_x + 2 * placement_radius + 14)); adb shell input tap "$zero_control_x" "$control_y"; adb shell input tap "$((width / 2 - 100))" "$((height / 2 + 80))"; printf '%s %s %s %s\n' "$pole_control_x" "$control_y" "$width" "$height" > /tmp/holomorphic-placement-coordinates
python3 tests/check_cauchy_motion.py holomorphic-motion-a.png holomorphic-motion-b.png
python3 tests/check_cauchy_structure_motion.py holomorphic-motion-a.png holomorphic-motion-b.png
set -- $(sed -n 's/.*Cauchy field ready: surface=\([0-9][0-9]*\)x\([0-9][0-9]*\).*/\1 \2/p' holomorphic-emulator.log | tail -1); width=$1; height=$2; min_side=$width; if [ "$height" -lt "$width" ]; then min_side=$height; fi; placement_radius=$((48 * min_side / 1000)); if [ "$placement_radius" -lt 26 ]; then placement_radius=26; fi; if [ "$placement_radius" -gt 38 ]; then placement_radius=38; fi; zero_control_x=$((placement_radius + 16)); control_y=$((height - placement_radius - 16)); pole_control_x=$((zero_control_x + 2 * placement_radius + 14)); adb shell input tap "$zero_control_x" "$control_y"; adb shell input tap "$((width / 2 - 100))" "$((height / 2 + 80))"; printf '%s %s %s %s\n' "$pole_control_x" "$control_y" "$width" "$height" > /tmp/holomorphic-placement-coordinates
sleep 1
read pole_control_x control_y width height < /tmp/holomorphic-placement-coordinates; adb shell input tap "$pole_control_x" "$control_y"; adb shell input tap "$((width / 2 + 120))" "$((height / 2 - 70))"
sleep 2
adb logcat -d > holomorphic-emulator.log
grep -Fq 'placement selected: pole' holomorphic-emulator.log
grep -Eq 'zero added: .*count=2' holomorphic-emulator.log
grep -Eq 'pole added: .*count=2' holomorphic-emulator.log
steps_after_edit=$(sed -n 's/.*holomorphic field: workers=3 steps=\([0-9][0-9]*\).*/\1/p' holomorphic-emulator.log | tail -1); test -n "$steps_after_edit"; test "$steps_after_edit" -gt "$steps_after_motion"
grep -Eq 'holomorphic field: workers=3 steps=[0-9]+ .*zeros=2 poles=2' holomorphic-emulator.log
! grep -Eiq 'shader compilation failed|program link failed|eglInitialize failed|could not choose GLES3 EGL config|could not create EGL surface/context|eglMakeCurrent failed|holomorphic field shader uniforms unavailable|FATAL EXCEPTION' holomorphic-emulator.log
! grep -Eiq 'shader compilation failed|program link failed|eglInitialize failed|could not choose GLES3 EGL config|could not create EGL surface/context|eglMakeCurrent failed|Cauchy field shader uniforms unavailable|FATAL EXCEPTION' holomorphic-emulator.log
adb exec-out screencap -p > holomorphic-emulator.png

- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
Expand Down
Loading
Loading