diff --git a/.cursorrules b/.cursorrules deleted file mode 100644 index 5b54998..0000000 --- a/.cursorrules +++ /dev/null @@ -1,4 +0,0 @@ -Run the code in a conda environment called bispectrum. -Activate the environment -Also activate the environment in the .venv file. -Do not use thick section separator comments like `# ----` or `# ===`. Let the code structure speak for itself. diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 248c0dc..08e2ff4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -41,4 +41,4 @@ jobs: uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} - slug: geometric-intelligence/bispectrum + slug: anonymous/bispectrum diff --git a/DESIGN.md b/DESIGN.md deleted file mode 100644 index 790d8dd..0000000 --- a/DESIGN.md +++ /dev/null @@ -1,516 +0,0 @@ -# Bispectrum Module — API Design Document - -**Status**: Accepted -**Author**: Johan Mathe -**Date**: 2026-02-23 - -______________________________________________________________________ - -## Overview - -This document specifies the API design for the `bispectrum` Python module. The goal is to provide a clean, mathematically faithful, and composable interface for computing G-Bispectra across different groups and domains — while keeping the library as simple as possible, but not simpler. - -______________________________________________________________________ - -## Core Design Principles - -01. **Simple is better than clever.** If there are two ways to do something, pick the one that needs less explanation. - -02. **`nn.Module` only.** No parallel functional APIs. One way to compute a bispectrum. - -03. **Naming encodes the math.** Class names follow `{Group}on{Domain}` — a reader unfamiliar with the codebase can immediately identify the group and the domain it acts on. - -04. **Raw signals in.** Modules take real-valued signals in the natural domain (spatial, discrete cycle, etc.) and handle the Fourier transform internally. This keeps the interface clean and the math self-contained. `SO3onS2` accepts a raw spatial signal `f` of shape `(batch, nlat, nlon)` and handles the SHT internally; `nlat` and `nlon` are constructor arguments so the `RealSHT` transform is pre-initialized at construction time for efficiency. - -05. **Selective by default.** All modules default to `selective=True`, computing the minimal subset of bispectral coefficients sufficient for complete signal reconstruction. `selective=False` is available for debugging and comparison. - -06. **Complex output.** `forward()` returns `torch.complex64`. Users who need real features can call `.abs()`, `.real`, or `torch.view_as_real()` — this is one line of code and avoids losing phase information. - -07. **Inversion on-module.** Every module exposes `invert(beta, **kwargs)`. For modules where inversion is mathematically available, it returns the reconstructed signal (up to group-action indeterminacy). For modules where inversion is not yet available, it raises a precise `NotImplementedError` with guidance. - -08. **float32 throughout.** For compatibility with GPU training pipelines. - -09. **Minimal dependencies.** Don't add a dependency if standard PyTorch/numpy can do the job. - -10. **Code is the math documentation.** Every module docstring references the exact paper theorem it implements. Every non-obvious operation cites an equation number. - -______________________________________________________________________ - -## Naming Convention: `{Group}on{Domain}` - -Groups act on domains. Both matter. The class name encodes both, in mathematical notation: - -| Class | Group | Domain | Description | -| -------------- | ------------------------------------------- | ------------------------------------------- | ---------------------------------------------- | -| `CnonCn` | $C_n$ | $C_n$ | Cyclic group acting on itself (discrete cycle) | -| `SO2onS1` | $\\mathrm{SO}(2)$ | $S^1$ | 2D rotations on the circle (wraps `CnonCn`) | -| `TorusOnTorus` | $C\_{n_1} \\times \\cdots \\times C\_{n_d}$ | $C\_{n_1} \\times \\cdots \\times C\_{n_d}$ | Discrete d-torus acting on itself | -| `DnonDn` | $D_n$ | $D_n$ | Dihedral group acting on itself | -| `SO3onS2` | $\\mathrm{SO}(3)$ | $S^2$ | 3D rotations on the 2-sphere | -| `SO2onDisk` | $\\mathrm{SO}(2)$ | Disk | 2D rotations on the unit disk | -| `OctaonOcta` | $O$ (octahedral group) | $\\mathbb{R}^3$ | Octahedral symmetries on 3D space | - -This convention is deliberately mathematical rather than verbal (`CyclicBispectrum`, etc.) because the mathematical name carries precise meaning and avoids ambiguity as the library grows. - -______________________________________________________________________ - -## Module Interface Contract - -Every bispectrum module is a `torch.nn.Module` satisfying this contract: - -```python -class {Group}on{Domain}(nn.Module): - - def __init__(self, ...): - """Initialize with group parameters. - - CG matrices and other precomputed quantities registered as buffers - (not parameters — they are not learnable). - """ - - def forward(self, f: torch.Tensor) -> torch.Tensor: - """Compute the G-Bispectrum of signal f. - - Args: - f: Real-valued signal on the domain. Shape: (batch, *domain_shape). - - Returns: - Complex bispectrum tensor. Shape: (batch, output_size). - """ - - def invert(self, beta: torch.Tensor, **kwargs) -> torch.Tensor: - """Attempt inversion from bispectrum coefficients. - - Default behavior can raise NotImplementedError for modules - where inversion is not yet available. - """ - - @property - def output_size(self) -> int: - """Number of bispectral coefficients in the output.""" - - @property - def index_map(self) -> list[tuple]: - """Maps flat output index → (irrep indices) tuple. - Allows interpreting which (rho_1, rho_2, rho) each output corresponds to. - """ -``` - -**Key invariants:** - -- No trainable parameters (`sum(p.numel() for p in bsp.parameters()) == 0`) -- Output is `torch.complex64` (complex float32) -- Module moves correctly with `.to(device)` and `.to(dtype)` -- Deterministic: same input always gives same output - -______________________________________________________________________ - -## Implemented Modules - -### `CnonCn(n: int)` — Cyclic group $C_n$ on $\\mathbb{Z}/n\\mathbb{Z}$ - -**Mathematical setting:** -Signal $f: \\mathbb{Z}/n\\mathbb{Z} \\to \\mathbb{R}$. Group $C_n$ acts by cyclic shift: $(T_g f)(x) = f(x - g \\bmod n)$. - -**Bispectrum formula** (commutative case, [Kakarala 2009]): - -$$\\beta(f)_{k_1, k_2} = \\hat{f}_{k_1} \\cdot \\hat{f}_{k_2} \\cdot \\hat{f}^\*_{k_1 + k_2 \\bmod n}$$ - -where: -$$ \\hat{f}_k = \\sum_{x=0}^{n-1} f(x), e^{-i \\frac{2\\pi k x}{n}} $$ - -is the DFT. - -**Selective coefficients** (Algorithm 1, [Mataigne et al. 2024]): -Full bispectrum has $n^2$ coefficients. Selective version needs only $n$: - -$${ \\beta\_{0,0},\\ \\beta\_{0,1},\\ \\beta\_{1,1},\\ \\beta\_{1,2},\\ \\ldots,\\ \\beta\_{1,n-2} }$$ - -These suffice for complete inversion (recovering $f$ up to cyclic shift). - -**Usage:** - -```python -bsp = CnonCn(n=8) -f = torch.randn(batch_size, 8) # signal on Z/8Z, shape (batch, n) -output = bsp(f) # shape (batch, output_size), complex64 - -print(bsp.output_size) # n = 8 (selective) or n² (full) -print(bsp.index_map) # [(0,0), (0,1), (1,1), (1,2), ...] -``` - -**Constructor parameters:** - -```python -CnonCn( - n: int, # Group order / signal length - selective: bool = True # Use selective O(n) or full O(n²) bispectrum -) -``` - -______________________________________________________________________ - -### `TorusOnTorus(ns: tuple[int, ...])` — Discrete d-torus $C\_{n_1} \\times \\cdots \\times C\_{n_d}$ - -**Mathematical setting:** -Signal $f: C\_{n_1} \\times \\cdots \\times C\_{n_d} \\to \\mathbb{R}$. The discrete d-torus $\\mathbb{T}^d = C\_{n_1} \\times \\cdots \\times C\_{n_d}$ is a finite abelian group acting on itself by componentwise translation: $(T_g f)(x) = f(x - g \\bmod \\mathbf{n})$. - -**Bispectrum formula** (commutative case, [Kakarala 2009]): - -$$\\beta(f)\_{\\mathbf{k}\_1, \\mathbf{k}\_2} = \\hat{f}\_{\\mathbf{k}\_1} \\cdot \\hat{f}\_{\\mathbf{k}\_2} \\cdot \\hat{f}^\\\*\_{(\\mathbf{k}\_1 + \\mathbf{k}\_2) \\bmod \\mathbf{n}}$$ - -where $\\hat{f}$ is the $d$-dimensional DFT (`torch.fft.fftn`) and $\\mathbf{k}\_1, \\mathbf{k}\_2$ are multi-indices with componentwise modular addition. All irreps are 1D characters, so no Clebsch-Gordan matrices are needed. - -**Selective coefficients** (Theorem 4.3, Algorithm 2, [Mataigne et al. 2024]): -Full bispectrum has $|G|^2$ coefficients. Selective version needs only $|G| = \\prod_l n_l$: - -The algorithm performs a BFS on the dual group $\\hat{G} \\cong G$ using generators $\\mathbf{e}\_l$ (standard basis vectors). For each element $\\mathbf{k}$ in row-major order, the selective pair is $(\\mathbf{e}\_l, \\mathbf{k} - \\mathbf{e}\_l)$ where $l$ is the first axis with $k_l > 0$. - -**Inversion** (Algorithm 2, Appendix D): -Bootstrap from the trivial representation along each axis independently, then fill remaining entries column-by-column. The recovered signal has $d$ free phase ambiguities (one translation per axis). - -**Usage:** - -```python -# 2D periodic image (28×28 torus) -bsp = TorusOnTorus(ns=(28, 28)) -f = torch.randn(batch_size, 28, 28) # signal on torus, shape (batch, n1, n2) -output = bsp(f) # shape (batch, 784), complex64 -f_rec = bsp.invert(output) # shape (batch, 28, 28), complex - -# 3D periodic volume -bsp3d = TorusOnTorus(ns=(32, 32, 32)) -vol = torch.randn(batch_size, 32, 32, 32) -output3d = bsp3d(vol) # shape (batch, 32768), complex64 - -print(bsp.output_size) # 784 (selective) -print(bsp.group_order) # 784 -print(bsp.ndim) # 2 -``` - -**Constructor parameters:** - -```python -TorusOnTorus( - ns: tuple[int, ...], # Shape of the torus (e.g. (8, 8) for C_8 × C_8) - selective: bool = True # Use selective O(|G|) or full O(|G|²) bispectrum -) -``` - -______________________________________________________________________ - -### `DnonDn(n: int)` — Dihedral group $D_n$ on $D_n$ - -**Mathematical setting:** -Signal $f: G \\to \\mathbb{R}$ where $G = D_n = \\langle a, x \\mid a^n = x^2 = e,\\ xax = a^{-1} \\rangle$. -$D_n$ acts on $\\mathbb{R}^2$ via rotations ($a$: rotation by $2\\pi/n$) and reflections ($x$: flip). - -**Irreducible representations:** - -- 2D irreps $\\rho_k$, $k = 1, \\ldots, \\lfloor(n-1)/2\\rfloor$: - -$$\\rho_k(a^l x^m) = \\begin{pmatrix} \\cos(\\tfrac{2\\pi lk}{n}) & -\\sin(\\tfrac{2\\pi lk}{n}) \\ \\sin(\\tfrac{2\\pi lk}{n}) & \\cos(\\tfrac{2\\pi lk}{n}) \\end{pmatrix} \\begin{pmatrix} 1 & 0 \\ 0 & -1 \\end{pmatrix}^m$$ - -- 1D irreps: $\\rho_0$ (trivial), $\\rho\_{01}$, and (for $n$ even) $\\rho\_{02}$, $\\rho\_{03}$ - -**Selective coefficients** (Algorithm 3, [Mataigne et al. 2024]): -Only $\\lfloor(n-1)/2\\rfloor + 2$ matrix-valued bispectral coefficients needed, corresponding to approximately $4\\lvert D_n \\rvert$ scalar values. - -**Usage:** - -```python -bsp = DnonDn(n=4) -f = torch.randn(batch_size, 8) # signal on D_4 (|D_4| = 2n = 8), shape (batch, 2n) -output = bsp(f) # shape (batch, output_size), float32 -``` - -Note: unlike `CnonCn`, `DnonDn.forward()` returns `float32` (not `complex64`) because all $D_n$ irreps are real-valued, so bispectral coefficients are real. - -**Constructor parameters:** - -```python -DnonDn( - n: int, # Polygon order (|D_n| = 2n) - selective: bool = True -) -``` - -______________________________________________________________________ - -### `SO3onS2(lmax: int)` — $\\mathrm{SO}(3)$ on $S^2$ - -**Mathematical setting:** -Signal $f: S^2 \\to \\mathbb{R}$. Group $\\mathrm{SO}(3)$ acts by 3D rotation. - -**Bispectrum formula** \[Kakarala 1992, Cohen et al.\]: - -$$\\beta(f)_{l_1, l_2}^{(l)} = \\sum_{m_1, m_2, m} C(l_1,m_1;\\ l_2,m_2 \\mid l,m)\\ a\_{l_1}^{m_1}\\ a\_{l_2}^{m_2}\\ \\overline{a_l^m}$$ - -where $a_l^m$ are the spherical harmonic coefficients and $C$ denotes the Clebsch-Gordan coefficients for $\\mathrm{SO}(3)$. Each $\\beta\_{l_1,l_2,l}$ is a scalar (real for real signals). The full bispectrum has $O(L^3)$ entries. - -**Selective bispectrum** (this work, see `docs/selective_so3_on_s2_completeness.md`): -$O(L^2)$ entries suffice for generic completeness, achieving the dimensional lower bound $(L+1)^2 - 3$. For each degree $l$, up to $2l+1$ triples are selected by priority from four categories: chain entries (linear in $F_l$), cross entries (linear), power entries (quadratic), and self-coupling entries (quadratic/cubic). At $l \\geq 4$, only linear entries are needed and recovery is a direct linear solve. - -**Clebsch-Gordan matrices:** -Computed analytically via the Wigner 3j symbol (Racah formula) with log-factorial numerics. No external dependency or precomputed JSON required. Cached to disk after first computation. Any `lmax` is supported. - -**Usage:** - -```python -# Full bispectrum: O(L³) entries -bsp_full = SO3onS2(lmax=5, nlat=64, nlon=128, selective=False) - -# Selective bispectrum: O(L²) entries -bsp_sel = SO3onS2(lmax=5, nlat=64, nlon=128, selective=True) - -f = torch.randn(batch_size, 64, 128) # signal on S², shape (batch, nlat, nlon) -output = bsp_sel(f) # shape (batch, 35), complex64 - -print(bsp_full.output_size) # 69 -print(bsp_sel.output_size) # 35 -``` - -**Constructor parameters:** - -```python -SO3onS2( - lmax: int = 5, # Maximum spherical harmonic degree (any value supported) - nlat: int = 64, # Latitude grid points - nlon: int = 128, # Longitude grid points - selective: bool = True # Selective O(L²) or full O(L³) bispectrum -) -``` - -> **Breaking change from v0.1.0**: v0.1.0 accepted pre-computed SH coefficients. v0.2.0 accepts raw spatial signals and handles SHT internally. - -______________________________________________________________________ - -### `OctaonOcta()` — Octahedral group $O$ on $\\mathbb{R}^3$ - -**Mathematical setting:** -Signal $f: O \\to \\mathbb{R}$ where $O$ is the rotation symmetry group of the cube ($|O| = 24$). $O$ acts on itself by left-translation: $(T_g f)(h) = f(g^{-1}h)$. - -**Irreducible representations:** -$O$ has 5 real irreps with dimensions $(1, 3, 3, 2, 1)$: - -- $\\rho_0$ (trivial, $A_1$): 1D -- $\\rho_1$ (standard 3D, $T_1$): 3D — the natural action on $\\mathbb{R}^3$ -- $\\rho_2$ (product $T_2 = A_2 \\otimes T_1$): 3D -- $\\rho_3$ (2D, $E$): 2D -- $\\rho_4$ (alternating, $A_2$): 1D - -**Selective bispectrum** (Appendix B, [Mataigne et al. 2024]): -4 matrix-valued coefficients: $\\beta\_{\\rho_0,\\rho_0}$, $\\beta\_{\\rho_0,\\rho_1}$, $\\beta\_{\\rho_1,\\rho_1}$, $\\beta\_{\\rho_1,\\rho_2}$, totalling 172 real scalars. - -**Inversion:** -Unlike $D_n$, the bootstrap method does not extend directly to $O$: the symmetric square root of $F_1^T F_1$ introduces a continuous $\\mathrm{SO}(3)$ phase ambiguity that the discrete CG structure cannot resolve. The `invert` method uses bootstrap initialization (exact Fourier norms, approximate phases) followed by Levenberg-Marquardt correction steps with multi-start phase perturbations. - -**Usage:** - -```python -bsp = OctaonOcta() -f = torch.randn(batch_size, 24) # signal on O (|O| = 24), shape (batch, 24) -output = bsp(f) # shape (batch, 172), complex64 - -f_rec = bsp.invert(output) # shape (batch, 24), up to group action -``` - -**Constructor parameters:** - -```python -OctaonOcta( - selective: bool = True # Selective (172 coefs) or full bispectrum -) -``` - -______________________________________________________________________ - -### `SO2onDisk(L: int)` — $\\mathrm{SO}(2)$ on the unit disk - -**Mathematical setting:** -Signal $f: \\mathbb{D} \\to \\mathbb{R}$ on the unit disk. Group $\\mathrm{SO}(2)$ acts by rotation: $(T\_\\phi f)(r, \\theta) = f(r, \\theta - \\phi)$. - -**Disk Harmonic Transform** (Fourier-Bessel basis): - -$$a\_{n,k} = \\int_0^1 \\int_0^{2\\pi} f(r,\\theta) \\cdot c\_{nk} \\cdot J_n(\\lambda\_{nk} r) \\cdot e^{-in\\theta} \\, r \\, dr \\, d\\theta$$ - -where $\\lambda\_{nk}$ is the $k$-th positive root of $J_n$ and $c\_{nk}$ is a normalisation constant. - -**Selective bispectrum** (Definition 4.2, [Myers & Miolane 2025]): - -$$b\_{0,0,k} = a\_{0,1}^2 \\cdot \\overline{a\_{0,k}}, \\qquad b\_{2,n,k} = a\_{1,1} \\cdot a\_{n,1} \\cdot \\overline{a\_{n+1,k}}$$ - -This reduces the bispectrum from $O(N^3)$ to $O(N)$ coefficients while preserving injectivity up to rotation. - -**Usage:** - -```python -bsp = SO2onDisk(L=16) -f = torch.randn(batch_size, 16, 16) # signal on disk, shape (batch, L, L) -output = bsp(f) # shape (batch, output_size), complex128 -f_rec = bsp.invert(output) # shape (batch, L, L), float64 -``` - -**Constructor parameters:** - -```python -SO2onDisk( - L: int, # Grid resolution (L x L image) - selective: bool = True, # Selective O(N) or full O(N³) bispectrum - bandlimit: float | None = None # Explicit Bessel root cutoff (default: auto from L) -) -``` - -**Bessel root computation:** -All Bessel roots are computed internally via `_bessel.py` — a pure-torch implementation using the interlacing property $j\_{n-1,k} < j\_{n,k} < j\_{n-1,k+1}$ with Newton-bisection polishing. No scipy dependency. - -______________________________________________________________________ - -## Selectivity Roadmap - -The central value proposition of the library is the *selective* G-bispectrum: a minimal subset of bispectral pairs $(\\rho, \\sigma)$ that suffices for complete signal reconstruction, reducing coefficient count from $O(\\lvert G\\rvert^2)$ to $O(\\lvert G\\rvert)$. - -This is proven for finite groups (Mataigne et al. 2024) and extended to $\\mathrm{SO}(3)$ on $S^2$ (this work, generic completeness). Here, `O` denotes the finite octahedral rotation group (not the full orthogonal group). The table below tracks the current state across all group/domain combinations of interest. - -| Class | Group | Domain | Selective? | Inversion? | Status | -| -------------- | -------------------- | ---------------------------------- | ----------------------------------------------- | --------------- | ----------------- | -| `CnonCn` | $C_n$ | $C_n$ | ✅ $n$ coefficients | ✅ Algorithm 1 | ✅ Done | -| `SO2onS1` | $\\mathrm{SO}(2)$ | $S^1$ | ✅ $n$ coefficients (via `CnonCn`) | ✅ Algorithm 1 | ✅ Done | -| `TorusOnTorus` | $\\prod C\_{n_l}$ | $\\prod C\_{n_l}$ | ✅ $\\lvert G \\rvert$ coefs | ✅ Algorithm 2 | ✅ Done | -| `DnonDn` | $D_n$ | $D_n$ | ✅ $\\lfloor(n{-}1)/2\\rfloor{+}2$ matrix coefs | ✅ Algorithm 3 | ✅ Done | -| `OctaonOcta` | $O$ | $\\mathbb{R}^3$ | ✅ 4 matrix coefs (paper App. B) | ✅ Bootstrap+LM | ✅ Done | -| `SO3onS2` | $\\mathrm{SO}(3)$ | $S^2$ | ✅ $O(L^2)$ coefficients (generic completeness) | ❌ | ✅ Selective done | -| `SO2onDisk` | $\\mathrm{SO}(2)$ | Disk | ✅ $N$ coefficients (Myers & Miolane 2025) | ✅ | ✅ Done | -| — | $\\mathrm{SO}(3)$ | $S^2 \\times \\mathbb{R}^+$ (ball) | ❌ Full only | ❌ | Open problem | -| — | Compact $G$ | $G$ | ❌ Full only | ❌ | Open problem | -| — | Homogeneous $(H, G)$ | $H = G/G_0$ | ❌ Full only | ❌ | Open problem | - -Sources: Mataigne et al. 2024 for finite-group ✅ entries; Myers & Miolane 2025 for SO2onDisk; this work for SO3onS2 selective completeness (see `docs/selective_so3_on_s2_completeness.md`). - -### Mathematical TODOs - -The following are open mathematical problems whose solutions would directly extend the library: - -**~~TODO-M1~~ DONE: Selective bispectrum for $\\mathrm{SO}(3)$ on $S^2$** - -Solved. The selective SO(3) bispectrum on $S^2$ uses $O(L^2)$ scalar entries instead of $O(L^3)$, achieving the dimensional lower bound $(L+1)^2 - 3$ for a complete invariant. For each degree $l$, up to $2l+1$ bispectral triples are selected from four priority categories (chain, cross, power, self-coupling). At $l \\geq 4$ only linear entries are needed; recovery is a linear solve. Completeness holds for Lebesgue-a.e. band-limited signal (generic completeness). See `docs/selective_so3_on_s2_completeness.md` for the full construction and proof sketch. Implemented in `SO3onS2(selective=True)`. - -**~~TODO-M2~~ DONE: Selective bispectrum for $\\mathrm{SO}(2)$ on the disk** - -Solved by Myers & Miolane (2025). The selective disk bispectrum (Definition 4.2) reduces from $O(N^3)$ to $O(N)$ coefficients while preserving injectivity (up to rotation). Inversion is available via a bootstrap from the $(0,1)$ coefficient. Implemented in `SO2onDisk`. - -**TODO-M3: Selective bispectrum for $\\mathrm{SO}(3)$ on the ball $S^2 \\times \\mathbb{R}^+$** - -Same challenge as TODO-M1 plus the radial dimension. The bispectrum formula is identical to the $S^2$ case (same equivariance); selectivity is the open question. - -**TODO-M4: Inversion algorithms for continuous groups** - -For finite groups, inversion follows from recovering each $F(f)_\\rho$ via a bootstrap from the trivial representation. For compact/continuous groups (where irreps are infinite-dimensional in the $l \\to \\infty$ limit), the analogous reconstruction strategy needs to contend with truncation and stability. Conditioning of the bootstrap in the presence of $l_\\mathrm{max}$ truncation is the key question. - -______________________________________________________________________ - -## Public API Surface - -The top-level `bispectrum` namespace exposes only what a user needs: - -```python -# Main modules -from bispectrum import CnonCn, DnonDn, OctaonOcta, SO2onDisk, SO2onS1, SO3onS2, TorusOnTorus - -# Rotation utilities (useful for testing/data augmentation) -from bispectrum import random_rotation_matrix, rotate_spherical_function -``` - -**Explicitly not exported:** - -- `clebsch_gordan` (internal implementation detail; current placeholder removed) -- `compute_padding_indices`, `pad_sh_coefficients`, `get_full_sh_coefficients` (SO(3) internals) -- Any `_private` helper functions - -We do not depend on `escnn` or any external library for Clebsch-Gordan coefficients. Instead: - -- **$C_n$**: No CG matrices needed. The bispectrum for commutative groups reduces to scalar products — no change-of-basis required. -- **$D_n$**: CG matrices are computed analytically from the explicit 2D irrep formulas (given in the paper). These are closed-form rotation matrices; no library is needed. -- **$\\mathrm{SO}(3)$**: CG matrices are computed analytically via the Wigner 3j symbol (Racah formula) with log-factorial numerics for stability at large $l$. Results are cached to `~/.cache/bispectrum/cg_lmax{N}.pt` after first computation. Any `lmax` is supported — no bundled JSON limit. - -This keeps the dependency footprint minimal and makes the math transparent — CG coefficients are computed from first principles, not treated as a black box. - -______________________________________________________________________ - -## What Goes in Each File - -``` -src/bispectrum/ -├── __init__.py # Public exports only -├── cn_on_cn.py # CnonCn -├── so2_on_s1.py # SO2onS1 (subclass of CnonCn) -├── torus_on_torus.py # TorusOnTorus -├── dn_on_dn.py # DnonDn -├── octa_on_octa.py # OctaonOcta -├── so3_on_s2.py # SO3onS2 (refactored) -├── so2_on_disk.py # SO2onDisk -├── rotation.py # random_rotation_matrix, rotate_spherical_function -├── _bessel.py # Internal Bessel function utilities (not exported) -└── _cg.py # Internal CG utilities (not exported) -``` - -Files removed in v0.2.0: - -- `clebsch_gordan.py` → merged into `_cg.py` (internal) -- `spherical.py` → folded into `so3_on_s2.py` -- `so3.py` → replaced by `so3_on_s2.py` - -______________________________________________________________________ - -## Testing Philosophy - -Every bispectrum module must have tests for: - -1. **Output shape** — `(batch, output_size)` for various batch sizes -2. **G-invariance** — `bsp(T_g(f)) ≈ bsp(f)` for random $g$, random $f$ - This is the *most important test*. If this fails, nothing else matters. -3. **Determinism** — same input → same output -4. **Device/dtype compatibility** — works on CPU, moves to GPU correctly -5. **No trainable parameters** — `sum(p.numel() for p in bsp.parameters()) == 0` -6. **Numerical precision** — invariance holds to `atol=1e-4` in float32 - -For every module where inversion is mathematically available: -7\. **Inversion test** — call `bsp.invert(beta)` and check reconstruction error up to the known group-action indeterminacy. - -For modules where inversion is not yet available (e.g., current SO(3) selective roadmap): -8\. **Explicit NotImplemented test** — ensure `bsp.invert(...)` raises a clear, documented `NotImplementedError`. - -```python -# Example: canonical invariance test pattern -def test_invariance(self): - bsp = CnonCn(n=8) - f = torch.randn(4, 8) - shift = 3 # arbitrary cyclic shift - f_shifted = torch.roll(f, shift, dims=-1) - - torch.testing.assert_close(bsp(f), bsp(f_shifted), atol=1e-4, rtol=1e-4) -``` - -______________________________________________________________________ - -## Migration from v0.1.0 - -| v0.1.0 | v0.2.0 | Notes | -| ------------------------------------- | ----------------------------------------------- | -------------------------------------------- | -| `SO3onS2(lmax=5)(coeffs)` | `SO3onS2(lmax=5, nlat=64, nlon=128)(f_spatial)` | Now takes spatial signal | -| `bispectrum(f_coeffs, l1, l2, cg_fn)` | Removed | Use `SO3onS2` module | -| `clebsch_gordan(l1, l2)` | Removed | Internal; computed analytically via `_cg.py` | -| `compute_padding_indices(...)` | Removed (internal) | | -| `pad_sh_coefficients(...)` | Removed (internal) | | -| `get_full_sh_coefficients(...)` | Removed (internal) | | - -______________________________________________________________________ - -## References - -- Myers & Miolane (2025). *The Selective Disk Bispectrum and Its Inversion, with Application to Multi-Reference Alignment*. arXiv preprint. [arXiv:2511.19706](https://arxiv.org/abs/2511.19706) -- Mataigne et al. (2024). *The Selective G-Bispectrum and its Inversion: Applications to G-Invariant Networks*. NeurIPS 2024. [arXiv:2407.07655](https://arxiv.org/abs/2407.07655) -- Kakarala (1992). *Triple Correlation on Groups*. PhD thesis, UC Irvine. -- Kakarala (2009). *Bispectrum on Finite Groups*. ICASSP 2009. -- Cohen & Welling (2016). *Group Equivariant Convolutional Networks*. ICML 2016. -- Weiler & Cesa (2019). *General E(2)-Equivariant Steerable CNNs*. NeurIPS 2019. diff --git a/README.md b/README.md index b1e62d1..e59f7df 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,45 @@ # bispectrum -[![Tests](https://github.com/geometric-intelligence/bispectrum/actions/workflows/tests.yml/badge.svg)](https://github.com/geometric-intelligence/bispectrum/actions/workflows/tests.yml) -[![Pre-commit](https://github.com/geometric-intelligence/bispectrum/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/geometric-intelligence/bispectrum/actions/workflows/pre-commit.yml) -[![codecov](https://codecov.io/github/geometric-intelligence/bispectrum/graph/badge.svg?token=J6GGY4VK1E)](https://codecov.io/github/geometric-intelligence/bispectrum) +An open-source, fully unit-tested PyTorch library that implements *selective* G-bispectra for seven group actions as differentiable `torch.nn.Module`s, ready to plug into ML pipelines and deep learning architectures. -Bispectrum analysis for machine learning. +The G-bispectrum is a principled *complete* invariant of a signal — it retains all information up to the group action. Selectivity reduces cost from O(|G|²) to O(|G|) for finite groups, and from O(L³) to Θ(L²) coefficients for SO(3) on S². + +## Supported Groups + +| Module | Group / Domain | Output mode | Complexity (selective) | +|--------|---------------|-------------|----------------------| +| `CnonCn` | C_n on C_n | selective + full | O(n) | +| `SO2onS1` | SO(2) on S¹ | selective + full | O(n) | +| `TorusOnTorus` | T^d | selective + full | O(n) | +| `DnonDn` | D_n on D_n | selective | O(n) | +| `SO2onDisk` | SO(2) on disk | selective | O(L) | +| `SO3onS2` | SO(3) on S² | selective + full | Θ(L²) | +| `OctaonOcta` | chiral octahedral O (24 elements) | selective | 172 coefficients | + +`SO2onS1` is the continuous-n limit of `CnonCn` and shares its implementation. + +## API + +Every module exposes a uniform interface: + +- **`forward(f)`** — selective (default) or full bispectral invariants +- **`fourier(f)`** — group Fourier coefficients +- **`invert(beta)`** — signal reconstruction up to group-action indeterminacy (where available) + +Modules default to O(|G|) selective coefficients; pass `selective=False` for the full O(|G|²) set. CG matrices, DFT kernels, and Bessel roots are precomputed as non-learnable buffers. Dependencies: PyTorch, NumPy, and `torch_harmonics` (for `SO3onS2`). + +## Benchmarks + +Median wall-clock on a single NVIDIA H100 80 GB GPU (batch=16, `torch.utils.benchmark`): + +| Module | Group | \|G\| / L_max | Coefs (sel.) | Coefs (full) | Fwd sel. (ms) | Fwd full (ms) | +|--------|-------|-----------|------------|-------------|--------------|----------------| +| `CnonCn` | C_128 | 128 | 128 | 8,256 | 0.14 | 8.53 | +| `TorusOnTorus` | C_32 × C_32 | 1,024 | 1,024 | 524,800 | 0.07 | 0.31 | +| `DnonDn` | D_32 | 64 | 245 | — | 0.57 | — | +| `SO2onDisk` | SO(2) | L=16 | 105 | — | 0.22 | — | +| `SO3onS2` | SO(3) | L=16 | 430 | — | 0.48 | — | +| `OctaonOcta` | O | 24 | 172 | — | 0.68 | — | ## Installation @@ -21,8 +56,6 @@ uv pip install bispectrum ### Development ```bash -git clone https://github.com/geometric-intelligence/bispectrum.git -cd bispectrum uv pip install -e ".[dev]" pre-commit install ``` @@ -81,8 +114,6 @@ beta = bsp(f) # shape (4, 172), complex64 f_rec = bsp.invert(beta) # reconstructed up to group action ``` -See [DESIGN.md](DESIGN.md) for the full API and all supported groups. - ## License MIT diff --git a/benchmarks/figures/bench1_coefficient_count.pdf b/benchmarks/figures/bench1_coefficient_count.pdf deleted file mode 100644 index 2fbafa6..0000000 Binary files a/benchmarks/figures/bench1_coefficient_count.pdf and /dev/null differ diff --git a/benchmarks/figures/bench1_coefficient_count.png b/benchmarks/figures/bench1_coefficient_count.png deleted file mode 100644 index a1e08c0..0000000 Binary files a/benchmarks/figures/bench1_coefficient_count.png and /dev/null differ diff --git a/benchmarks/figures/bench2_forward_cpu.pdf b/benchmarks/figures/bench2_forward_cpu.pdf deleted file mode 100644 index d3ff489..0000000 Binary files a/benchmarks/figures/bench2_forward_cpu.pdf and /dev/null differ diff --git a/benchmarks/figures/bench2_forward_cpu.png b/benchmarks/figures/bench2_forward_cpu.png deleted file mode 100644 index 8a22a71..0000000 Binary files a/benchmarks/figures/bench2_forward_cpu.png and /dev/null differ diff --git a/benchmarks/figures/bench2_forward_gpu.pdf b/benchmarks/figures/bench2_forward_gpu.pdf deleted file mode 100644 index c398900..0000000 Binary files a/benchmarks/figures/bench2_forward_gpu.pdf and /dev/null differ diff --git a/benchmarks/figures/bench2_forward_gpu.png b/benchmarks/figures/bench2_forward_gpu.png deleted file mode 100644 index a9dde25..0000000 Binary files a/benchmarks/figures/bench2_forward_gpu.png and /dev/null differ diff --git a/benchmarks/figures/bench3_inversion_cpu.pdf b/benchmarks/figures/bench3_inversion_cpu.pdf deleted file mode 100644 index 70ae869..0000000 Binary files a/benchmarks/figures/bench3_inversion_cpu.pdf and /dev/null differ diff --git a/benchmarks/figures/bench3_inversion_cpu.png b/benchmarks/figures/bench3_inversion_cpu.png deleted file mode 100644 index 6e2e52b..0000000 Binary files a/benchmarks/figures/bench3_inversion_cpu.png and /dev/null differ diff --git a/benchmarks/figures/bench3_inversion_gpu.pdf b/benchmarks/figures/bench3_inversion_gpu.pdf deleted file mode 100644 index 0f3b0b0..0000000 Binary files a/benchmarks/figures/bench3_inversion_gpu.pdf and /dev/null differ diff --git a/benchmarks/figures/bench3_inversion_gpu.png b/benchmarks/figures/bench3_inversion_gpu.png deleted file mode 100644 index a967667..0000000 Binary files a/benchmarks/figures/bench3_inversion_gpu.png and /dev/null differ diff --git a/benchmarks/figures/bench4_gpu_scaling.pdf b/benchmarks/figures/bench4_gpu_scaling.pdf deleted file mode 100644 index c3e8f9b..0000000 Binary files a/benchmarks/figures/bench4_gpu_scaling.pdf and /dev/null differ diff --git a/benchmarks/figures/bench4_gpu_scaling.png b/benchmarks/figures/bench4_gpu_scaling.png deleted file mode 100644 index 4cabad7..0000000 Binary files a/benchmarks/figures/bench4_gpu_scaling.png and /dev/null differ diff --git a/benchmarks/figures/paper_fig1.pdf b/benchmarks/figures/paper_fig1.pdf deleted file mode 100644 index 2b8c6c0..0000000 Binary files a/benchmarks/figures/paper_fig1.pdf and /dev/null differ diff --git a/benchmarks/figures/paper_fig1.png b/benchmarks/figures/paper_fig1.png deleted file mode 100644 index 5d3b6ee..0000000 Binary files a/benchmarks/figures/paper_fig1.png and /dev/null differ diff --git a/benchmarks/figures/paper_fig2.pdf b/benchmarks/figures/paper_fig2.pdf deleted file mode 100644 index 1adcce1..0000000 Binary files a/benchmarks/figures/paper_fig2.pdf and /dev/null differ diff --git a/benchmarks/figures/paper_fig2.png b/benchmarks/figures/paper_fig2.png deleted file mode 100644 index e8215d7..0000000 Binary files a/benchmarks/figures/paper_fig2.png and /dev/null differ diff --git a/benchmarks/figures/paper_fig3.pdf b/benchmarks/figures/paper_fig3.pdf deleted file mode 100644 index 5a2e8af..0000000 Binary files a/benchmarks/figures/paper_fig3.pdf and /dev/null differ diff --git a/benchmarks/figures/paper_fig3.png b/benchmarks/figures/paper_fig3.png deleted file mode 100644 index 508c1e8..0000000 Binary files a/benchmarks/figures/paper_fig3.png and /dev/null differ diff --git a/benchmarks/figures/table_benchmarks.tex b/benchmarks/figures/table_benchmarks.tex deleted file mode 100644 index 66f946d..0000000 --- a/benchmarks/figures/table_benchmarks.tex +++ /dev/null @@ -1,23 +0,0 @@ -\begin{table}[t] - \centering - \caption{Benchmark summary for the \texttt{bispectrum} library. - Coefficient counts compare the selective ($O(|G|)$) and full ($O(|G|^2)$) bispectra. - Timings are median wall-clock on a single NVIDIA A100 GPU (batch\,=\,16 for forward, 4 for inversion). - ``--'' indicates the mode is not implemented.} - \label{tab:benchmarks} - \small - \begin{tabular}{llrrrrrr} - \toprule - Module & $G$ & $|G|$ & \multicolumn{2}{c}{Coefs} & \multicolumn{2}{c}{Fwd (ms)} & Inv (ms) \\ - \cmidrule(lr){4-5} \cmidrule(lr){6-7} - & & & Sel. & Full & Sel. & Full & Sel. \\ - \midrule - \texttt{CnonCn} & $C_{128}$ & 128 & 128 & 8256 & 0.15 & 9.17 & 8.56 \\ - \texttt{TorusOnTorus} & $C_{32}{\times}C_{32}$ & 1024 & 1024 & 524800 & 0.08 & 0.71 & 68.02 \\ - \texttt{DnonDn} & $D_{32}$ & 64 & 245 & -- & 2.52 & -- & 42.33 \\ - \texttt{SO2onDisk} & $\mathrm{SO}(2)$ & 1024 & 411 & -- & 1.94 & -- & 17.69 \\ - \texttt{SO3onS2} & $\mathrm{SO}(3)$ & 289 & 430 & -- & 26.54 & -- & -- \\ - \texttt{OctaonOcta} & $O$ & 24 & 172 & -- & 0.70 & -- & 2172.76 \\ - \bottomrule - \end{tabular} -\end{table} diff --git a/benchmarks/inversion_results/inversion_convergence.pdf b/benchmarks/inversion_results/inversion_convergence.pdf deleted file mode 100644 index 2184719..0000000 Binary files a/benchmarks/inversion_results/inversion_convergence.pdf and /dev/null differ diff --git a/benchmarks/inversion_results/inversion_convergence.png b/benchmarks/inversion_results/inversion_convergence.png deleted file mode 100644 index c9777fb..0000000 Binary files a/benchmarks/inversion_results/inversion_convergence.png and /dev/null differ diff --git a/benchmarks/inversion_results/inversion_errors.pdf b/benchmarks/inversion_results/inversion_errors.pdf deleted file mode 100644 index bc0761f..0000000 Binary files a/benchmarks/inversion_results/inversion_errors.pdf and /dev/null differ diff --git a/benchmarks/inversion_results/inversion_errors.png b/benchmarks/inversion_results/inversion_errors.png deleted file mode 100644 index a43fe10..0000000 Binary files a/benchmarks/inversion_results/inversion_errors.png and /dev/null differ diff --git a/benchmarks/inversion_results/inversion_stats.tex b/benchmarks/inversion_results/inversion_stats.tex deleted file mode 100644 index b835b17..0000000 --- a/benchmarks/inversion_results/inversion_stats.tex +++ /dev/null @@ -1,18 +0,0 @@ -\begin{table}[h] -\centering -\caption{Octahedral bispectrum inversion statistics (N=1000, 4 restarts $\times$ 10 LM steps).} -\label{tab:inversion-stats} -\begin{tabular}{lcc} -\toprule -Metric & Median & P95 \\ -\midrule -Bisp.\ residual $\|\beta(\hat{f}) - \beta^*\|$ & 5.7e-05 & 1.5e-04 \\ -Recovery error (mod $O$) & 1.0e+00 & 1.2e+00 \\ -Wall-clock time (ms) & 18.4 & 30.1 \\ -\midrule -Success rate (error <0.1) & \multicolumn{2}{c}{5.7%} \\ -Success rate (error <0.01) & \multicolumn{2}{c}{5.7%} \\ -Success rate (error <0.001) & \multicolumn{2}{c}{5.7%} \\ -\bottomrule -\end{tabular} -\end{table} diff --git a/benchmarks/paper_benchmarks.pdf b/benchmarks/paper_benchmarks.pdf deleted file mode 100644 index be11b22..0000000 Binary files a/benchmarks/paper_benchmarks.pdf and /dev/null differ diff --git a/benchmarks/paper_benchmarks.tex b/benchmarks/paper_benchmarks.tex deleted file mode 100644 index a3d9281..0000000 --- a/benchmarks/paper_benchmarks.tex +++ /dev/null @@ -1,190 +0,0 @@ -\documentclass[11pt]{article} -\usepackage[margin=1in]{geometry} -\usepackage{graphicx} -\usepackage{booktabs} -\usepackage{amsmath,amssymb} -\usepackage{hyperref} -\usepackage[T1]{fontenc} -\usepackage[expansion=false]{microtype} - -\title{Benchmark Report for the \texttt{bispectrum} Library} -\author{} -\date{\today} - -\begin{document} -\maketitle - -\section{Overview} - -This document presents computational benchmarks for the \texttt{bispectrum} -library, a PyTorch implementation of the group bispectrum for invariant signal -representations. -The library provides six distinct modules, each implementing the bispectrum for -a different group acting on a different space: -\begin{itemize} - \item \texttt{CnonCn} --- cyclic group $C_n$ acting on itself; - \item \texttt{TorusOnTorus} --- product of cyclic groups - $C_{n_1} \times \cdots \times C_{n_d}$ (torus $\mathbb{T}^d$) - acting on itself; - \item \texttt{DnonDn} --- dihedral group $D_n$ acting on itself; - \item \texttt{SO2onD2} --- continuous rotation group $\mathrm{SO}(2)$ - acting on the 2-disk $D^2$ (via truncated Bessel basis); - \item \texttt{SO3onS2} --- rotation group $\mathrm{SO}(3)$ acting on - the 2-sphere $S^2$ (via spherical harmonics); - \item \texttt{OctaonOcta} --- octahedral group $O$ (order 24) acting - on the octahedron. -\end{itemize} - -Each module is a \texttt{torch.nn.Module} exposing a \texttt{forward(f)} -method that computes the bispectrum of an input signal~$f$, and (where -available) an \texttt{invert(beta)} method that recovers a signal from its -bispectral coefficients up to the group action. - -A key design axis is \emph{selective} versus \emph{full} bispectrum: the full -bispectrum enumerates all $O(|G|^2)$ pairwise products of Fourier -coefficients, while the selective bispectrum retains only the $O(|G|)$ -coefficients needed for injectivity, following the theoretical framework of -Kakarala~(2012). - -All benchmarks were run on a single NVIDIA A100 80\,GB PCIe GPU with PyTorch -2.10. - -\section{Coefficient Scaling} - -\begin{figure}[ht] - \centering - \includegraphics[width=\textwidth]{figures/paper_fig1.pdf} - \caption{% - Number of bispectral coefficients as a function of group order~$|G|$ - for all six modules. - Solid lines with filled markers: selective bispectrum; dashed lines: - full bispectrum (shown for $C_n$ and $\mathbb{T}^2$ only, the two - modules that support it). - The gray $O(|G|)$ and $O(|G|^2)$ reference slopes are shown, with - the shaded region indicating where the full bispectrum lies. - All selective curves track the $O(|G|)$ slope. - The continuous-group modules ($\mathrm{SO}(2)/D^2$ and - $\mathrm{SO}(3)/S^2$) also follow the linear trend when plotted - against their effective bandwidth parameter. - The octahedral group $O$ ($|G|=24$, star) yields 172 selective - coefficients.} - \label{fig:coeff} -\end{figure} - -\paragraph{Discussion.} -Figure~\ref{fig:coeff} confirms that the selective bispectrum achieves the -theoretically predicted $O(|G|)$ coefficient count across all module families, -providing a quadratic reduction over the full $O(|G|^2)$ variant. -For the cyclic group at $|G| = 1024$, this translates from 524\,800 full -coefficients down to 1\,024 selective coefficients---a $512\times$ reduction. -The $D_n$ selective counts lie slightly above the $O(|G|)$ reference because -$D_n$ has more irreducible representations than $C_n$ at the same group order -(due to the semidirect product structure), but the scaling remains linear. -The continuous-group modules ($\mathrm{SO}(2)/D^2$ and $\mathrm{SO}(3)/S^2$) -exhibit comparable linear scaling when measured against the square of their -truncation bandwidth, confirming that the selective strategy extends -beyond finite groups. - -\section{Forward-Pass Timing} - -\begin{figure}[ht] - \centering - \includegraphics[width=\textwidth]{figures/paper_fig2.pdf} - \caption{% - Forward-pass wall-clock time (batch size~16, NVIDIA A100 GPU) for the - selective versus full bispectrum. - \textbf{(a)}~$C_n$ on $C_n$: the selective forward pass stays flat at - $\sim$0.19\,ms regardless of~$n$, while the full bispectrum grows - super-linearly to 25\,ms at $n=256$. - \textbf{(b)}~$\mathbb{T}^2 = C_n \times C_n$: the selective pass is - nearly constant ($\sim$0.1\,ms) up to $|G| = 65{,}536$, while the - full bispectrum diverges beyond $|G| \approx 1{,}000$.} - \label{fig:forward} -\end{figure} - -\paragraph{Discussion.} -Figure~\ref{fig:forward} demonstrates that the selective forward pass is -\emph{effectively free} on modern GPUs: the wall-clock time is dominated by -kernel-launch overhead rather than arithmetic, staying flat at -$\sim$0.1--0.2\,ms even as the group order increases by two orders of -magnitude. -The full bispectrum, in contrast, exhibits the expected super-linear growth and -rapidly becomes impractical for production use. -For the torus at $|G| = 1{,}024$ ($n = 32$), the full forward pass is already -$5\times$ slower than selective; extrapolating the quadratic trend to $n = 256$ -would exceed 100\,ms per sample. - -\section{GPU Batch Scaling and Inversion} - -\begin{figure}[ht] - \centering - \includegraphics[width=\textwidth]{figures/paper_fig3.pdf} - \caption{% - \textbf{(a)} GPU throughput (samples/s) as a function of batch size - for the selective forward pass at representative group sizes. - All modules exhibit near-linear scaling, confirming the selective - bispectrum is well suited to batched deep-learning workloads. - $C_n$ and $\mathbb{T}^2$ achieve over $10^7$~samples/s. - The octahedral group plateaus at $\sim$24\,k~samples/s due to its - fixed small signal dimension ($|G| = 24$) and CUDA launch overhead. - \textbf{(b)} Inversion wall-clock time for all modules supporting - \texttt{invert()} (batch size~4). - $C_n$, $D_n$, and $\mathrm{SO}(2)/D^2$ scale roughly linearly. - $\mathbb{T}^2$ grows as $O(|G| \log |G|)$ from multi-dimensional - inverse FFTs. - The octahedral group (star) requires $\sim$1\,s despite $|G| = 24$ - due to the least-squares optimization over all irreducible - representations of~$O$. - \texttt{SO3onS2} is absent because its inversion is not yet - implemented.} - \label{fig:scaling} -\end{figure} - -\paragraph{Discussion.} -Figure~\ref{fig:scaling}(a) shows that all selective-bispectrum modules scale -linearly with batch size on the GPU, which is the ideal behavior for -integration into batched training pipelines. -The throughput spans roughly three orders of magnitude across modules, -reflecting the underlying signal dimension: $C_{128}$ and $\mathbb{T}^2$ -($|G| = 1024$) process each sample in microseconds, while $O$ is much slower -per sample due to the structure of the octahedral bispectrum computation. -The key takeaway is that \emph{none of the modules exhibit throughput -degradation at large batch sizes}, confirming that the implementation is -memory-bandwidth-bound rather than compute-bound at these scales. - -Figure~\ref{fig:scaling}(b) reveals that inversion cost varies significantly -across modules. -For $C_n$ and $D_n$, inversion is essentially a linear-time operation (inverse -FFT plus phase retrieval), scaling as $O(|G|)$. -The $\mathrm{SO}(2)/D^2$ module shows similar linear scaling despite operating -over a continuous group (the truncated Bessel basis provides a -finite-dimensional approximation). -The torus module's inversion is more expensive, growing as $O(|G| \log |G|)$ -because it involves multi-dimensional inverse FFTs. -The octahedral group is an outlier: its inversion requires $\sim$1\,s for a -group of order~24, reflecting the combinatorial complexity of inverting over -the 5 non-trivial irreducible representations of~$O$ and the associated -least-squares optimization. - -\section{Summary Table} - -\input{figures/table_benchmarks.tex} - -Table~\ref{tab:benchmarks} summarizes key data points for each module at a -representative group size. -The selective coefficient count is always $O(|G|)$: for $C_{128}$, it equals -$|G| = 128$; for $D_{32}$ ($|G| = 64$), the 245 coefficients reflect the -richer representation theory of the dihedral group. -$\mathrm{SO}(2)/D^2$ at $L = 32$ (bandwidth 1024) yields 411 selective -coefficients and requires $\sim$12\,ms for a forward pass, dominated by the -Bessel-function evaluations in the radial basis. -$\mathrm{SO}(3)/S^2$ at $\ell_{\max} = 5$ produces 69 coefficients with a -comparable forward time; its inversion is not yet implemented. - -The ``full'' columns are only applicable to the abelian groups ($C_n$ and -$\mathbb{T}^2$), where the full bispectrum is the classical definition. -For non-abelian groups ($D_n$, $O$) and continuous groups ($\mathrm{SO}(2)$, -$\mathrm{SO}(3)$), only the selective bispectrum is implemented, as the full -enumeration would be either ill-defined or computationally intractable. - -\end{document} diff --git a/docs/beamer_slides.pdf b/docs/beamer_slides.pdf deleted file mode 100644 index 8a40ebb..0000000 Binary files a/docs/beamer_slides.pdf and /dev/null differ diff --git a/docs/beamer_slides.tex b/docs/beamer_slides.tex deleted file mode 100644 index 907d807..0000000 --- a/docs/beamer_slides.tex +++ /dev/null @@ -1,613 +0,0 @@ -\documentclass[aspectratio=169]{beamer} -\usetheme{metropolis} -\usepackage{booktabs} -\usepackage{amsmath,amssymb} -\usepackage{listings} - -\lstset{ - basicstyle=\ttfamily\scriptsize, - keywordstyle=\color{blue}, - commentstyle=\color{gray}, - breaklines=true, - frame=none, -} - -\title{Bispectrum Library: From Finite Groups to the Disk} -\subtitle{Implementing Mataigne et al.\ (NeurIPS 2024) \& Myers \& Miolane (arXiv 2025)} -\author{Johan Mathe} -\date{\today} - -\begin{document} - -\maketitle - -% ============================================================ -\begin{frame}{Goal} - Reimplement the selective $G$-bispectrum from Mataigne et al.\ (NeurIPS 2024) - in a standalone, clean PyTorch library. - - \bigskip - - Three group/domain families implemented: - \begin{itemize} - \item \textbf{CnonCn} --- cyclic groups $C_n$ acting on $\mathbb{Z}/n\mathbb{Z}$ \hfill\textit{Mataigne et al.} - \item \textbf{DnonDn} --- dihedral groups $D_n$ acting on $D_n$ \hfill\textit{Mataigne et al.} - \item \textbf{SO2onD2} --- $\mathrm{SO}(2)$ acting on the unit disk $\mathbb{D}^2$ \hfill\textit{Myers \& Miolane} - \end{itemize} - - \bigskip - - All three include \texttt{forward()} (bispectrum) and \texttt{invert()} (signal recovery). - - \smallskip - - Plus \textbf{SO3onS2} ($\mathrm{SO}(3)$ on $S^2$) --- forward only, no inversion. -\end{frame} - -% ============================================================ -\begin{frame}{Improvements over g-invariance repo} - \begin{table} - \scriptsize - \begin{tabular}{lll} - \toprule - \textbf{Aspect} & \textbf{g-invariance} & \textbf{bispectrum (new)} \\ - \midrule - Dependencies & escnn, einops, scipy & Pure PyTorch \\ - CG computation & \texttt{scipy.linalg.schur} & \texttt{torch.linalg.eig} \\ - Group size & $n \geq 8$ enforced & All $n > 2$ \\ - $n_3$ for odd $n$ & Bug: gives 0 for $n=3$ & Fixed \\ - Inversion & Not implemented & Algorithms 2 \& 4 \\ - Interface & escnn \texttt{GeometricTensor} & Raw \texttt{torch.Tensor} \\ - Normalization & Baked in & None (raw coefficients) \\ - Group DFT & $O(n^2)$ explicit & $O(n \log n)$ via FFT \\ - Tests & \textbf{None} & \textbf{180 tests} \\ - \bottomrule - \end{tabular} - \end{table} -\end{frame} - -% ============================================================ -\begin{frame}{Bugs found in g-invariance (1/2)} - \textbf{Bug 1: $n_3$ calculation breaks for small odd $n$} - - \smallskip - - g-invariance code: \texttt{n3 = n2 - 1} where $n_2 = \lfloor(n{-}1)/2\rfloor$. - - For $n=3$: $n_2 = 1$, so $n_3 = 0$ --- meaning \emph{zero} - $\beta_{\rho_1,\rho_k}$ coefficients are computed. - - \smallskip - - \textbf{Impact}: $\beta_{\rho_1,\rho_1}$ is needed to recover $\mathcal{F}(\rho_{01})$ - (Appendix~E of the paper proves $\rho_{01} \in \rho_1 \otimes \rho_1$). - Without it, the selective bispectrum for $D_3$ is \emph{incomplete} --- - the 1D irrep $\rho_{01}$ cannot be recovered during inversion. - - \smallskip - - \textbf{How discovered}: Writing parametrized tests over $n \in \{3, 4, 5, 7, 8\}$. - $D_3$ inversion failed because \texttt{output\_size} was only $1 + 4 = 5$ - (missing the $16 \times n_3$ block entirely). - The g-invariance repo never tested $n < 8$ due to bug~2. - - \smallskip - - \textbf{Fix}: \texttt{n3 = n2 if n \% 2 == 0 else max(n2 - 1, 1)}. -\end{frame} - -% ============================================================ -\begin{frame}{Bugs found in g-invariance (2/2)} - \textbf{Bug 2: Artificial $n \geq 8$ restriction} - - \smallskip - - \texttt{pooling.py} line 390: \texttt{if n < 8: raise ValueError}. - - \smallskip - - This came from escnn integration constraints, not from the math. - $D_n$ bispectrum is well-defined for all $n > 2$. Dropping this - restriction immediately exposed Bug~1. - - \bigskip - - \textbf{Bug 3: Paper typo in Algorithm 4} (next slide). - - \bigskip - - \textbf{Note}: The g-invariance repo had \textbf{zero unit tests}, - so these bugs were never caught. Bug~1 is silent --- it doesn't crash, - it just computes an incomplete bispectrum. -\end{frame} - -% ============================================================ -\begin{frame}{Paper typo in Algorithm 4 (bispectrum inversion on $D_n$)} - Algorithm 4, line 6 computes the block-diagonal Fourier coefficients via: - \[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_{k-1}} \mathcal{F}(\Theta)_\rho - = \Bigl( - C_{\rho_1,\rho_{k-1}}^\dagger - \bigl[\mathcal{F}_{\rho_1} \otimes \mathcal{F}_{\rho_{k-1}}\bigr]^{-1} - \beta_{\rho_1,\rho_{\mathbf{2}}} - \, C_{\rho_1,\rho_{k-1}} - \Bigr)^\dagger - \] - - The subscript on $\beta$ is printed as $\rho_2$ (fixed), but should be - $\rho_{k-1}$ (varying with the loop index $k$). The CG subscripts - $C_{\rho_1,\rho_{k-1}}$ are correct. - - \bigskip - - \textbf{How discovered}: When implementing inversion for $n=8$ (which has - $\lfloor\frac{7}{2}\rfloor = 3$ 2D irreps), the loop needs - $\beta_{\rho_1,\rho_1}$ then $\beta_{\rho_1,\rho_2}$ to recover - $\mathcal{F}(\rho_2)$ then $\mathcal{F}(\rho_3)$. - Using a fixed $\beta_{\rho_1,\rho_2}$ for both iterations gives wrong - Fourier coefficients --- the Frobenius norm roundtrip test fails. - - \bigskip - - The g-invariance code indexes $\beta$ by \texttt{k-1} in the loop, so it - was already correct despite the paper typo. - - \smallskip - - \textbf{Note}: Typo still present in the NeurIPS 2024 camera-ready - (Eq.~\texttt{eq:new\_coeff\_dihedral} and Algorithm~4, Appendix~E). -\end{frame} - -% ============================================================ -\begin{frame}{Technical challenges: CG matrices without scipy} - \textbf{Goal}: find orthogonal $C$ such that - $(\rho_i \otimes \rho_j)(g) = C \bigl[\bigoplus_\rho \rho(g)\bigr] C^\top$ - for all $g \in D_n$. - - \smallskip - - The g-invariance repo used \texttt{scipy.linalg.schur}. We need pure PyTorch. - - \smallskip - - \textbf{Step 1}: Eigendecompose $Q_a = \operatorname{kron}(\rho_i(a), \rho_j(a))$ - via \texttt{torch.linalg.eig}. This $4\times 4$ orthogonal matrix has - eigenvalues $e^{\pm i\theta}$ (conjugate pairs $\to$ 2D irreps) or $\pm 1$ - (real $\to$ 1D irreps). - - \smallskip - - \textbf{Step 2 --- 2D blocks}: For each conjugate pair $e^{\pm i\theta}$, - take $u_1 = \operatorname{Re}(v)$, $u_2 = \operatorname{Im}(v)$. - In this basis the block is $R(-\theta)$, but our irrep convention is - $\rho_k(a) = R(+2\pi k/n)$. - Fix: negate $u_2$ when $\theta > 0$ so the block becomes $R(+|\theta|)$. - - \smallskip - - \textbf{Step 3 --- 1D blocks}: When two 1D irreps share the same eigenvalue - under $a$ (e.g.\ $\rho_0$ and $\rho_{01}$ both have $+1$), the eigenspace is - 2D and \texttt{eig} won't split them. We restrict - $Q_x = \operatorname{kron}(\rho_i(x), \rho_j(x))$ to the degenerate - subspace and diagonalize with \texttt{eigh}; its eigenvalues $\pm 1$ separate - the two 1D irreps. - - \smallskip - - \textbf{Step 4 --- reflection alignment}: Rotate each 2D subspace by angle - $\alpha$ so that $C^\top Q_x\, C = \operatorname{diag}(1,-1)$, matching - the standard irrep form $\rho_k(x) = \bigl[\begin{smallmatrix}1&0\\0&-1\end{smallmatrix}\bigr]$. -\end{frame} - -% ============================================================ -\begin{frame}{Technical challenges: bispectrum formula} - Non-commutative bispectrum (Theorem 2.3): - \[ - \beta_{\rho_1,\rho_2} = \bigl[\mathcal{F}_{\rho_1} \otimes \mathcal{F}_{\rho_2}\bigr] - \, C \, \bigl[\bigoplus_\rho \mathcal{F}_\rho^\top\bigr] \, C^\top - \] - - \bigskip - - Getting the transpose/adjoint conventions right for real-valued irreps - required several iterations. Initial implementation broke $D_n$ invariance - due to incorrect matrix multiplication order. - - \bigskip - - Verified by testing invariance under all $n$ rotations and reflections - for $n \in \{3, 4, 5, 7, 8, 16\}$. -\end{frame} - -% ============================================================ -\begin{frame}{Technical challenges: $O(2)$ indeterminacy in inversion} - Algorithm 4 recovers $\mathcal{F}(\rho_1)$ from: - \[ - \frac{\beta_{\rho_0,\rho_1}}{\mathcal{F}(\rho_0)} = \mathcal{F}(\rho_1)^\top \mathcal{F}(\rho_1) - \] - - This determines $\mathcal{F}(\rho_1)$ only up to $Q \in O(2)$: any $Q \cdot \mathcal{F}(\rho_1)$ also satisfies the equation. - - \bigskip - - \textbf{Consequence}: exact bispectrum roundtrip $\beta \to \text{invert} \to \text{forward} \to \beta' = \beta$ cannot hold for all coefficients. This is a \emph{theoretical} limitation, not a bug. - - \bigskip - - \textbf{What we guarantee}: - \begin{itemize} - \item $\beta_{\rho_0,\rho_0}$ and $\beta_{\rho_0,\rho_1}$ roundtrip exactly (they are $O(2)$-invariant) - \item Frobenius norms $\|\mathcal{F}(\rho_k)\|_F$ match for all $k$ - \end{itemize} -\end{frame} - -% ============================================================ -\begin{frame}{From group DFT to standard FFT: the derivation} - The $D_n$ group DFT for 2D irrep $\rho_k$ sums over rotation and reflection elements: - \[ - \hat{f}(\rho_k) = \sum_{l=0}^{n-1} f_{\text{rot}}(l)\, R\!\left(\tfrac{2\pi kl}{n}\right)^{\!\top} - + \sum_{l=0}^{n-1} f_{\text{ref}}(l)\, \bigl[R\!\left(\tfrac{2\pi kl}{n}\right) \operatorname{diag}(1,-1)\bigr]^{\!\top} - \] - - Expand the $2\times 2$ entries, noting $R(\theta)^\top = \bigl[\begin{smallmatrix}\cos\theta & \sin\theta \\ -\sin\theta & \cos\theta\end{smallmatrix}\bigr]$: - \[ - \hat{f}_{00}^{(k)} = \textstyle\sum_l f_{\text{rot}}(l)\cos\theta_{kl} + \sum_l f_{\text{ref}}(l)\cos\theta_{kl} - \] - - But $\texttt{fft}(f)[k] = \sum_l f(l)\, e^{-i 2\pi kl/n}$, so - $\operatorname{Re}(F_{\text{rot}}[k]) = \sum_l f_{\text{rot}}(l) \cos\theta_{kl}$. - - \smallskip - - Therefore all four matrix entries are Re/Im combinations of two standard FFTs: - \[ - \hat{f}^{(k)} = \begin{bmatrix} - \operatorname{Re}F_r + \operatorname{Re}F_x & \operatorname{Im}F_r - \operatorname{Im}F_x \\ - -\operatorname{Im}F_r - \operatorname{Im}F_x & \operatorname{Re}F_r - \operatorname{Re}F_x - \end{bmatrix} - \] - where $F_r = \texttt{fft}(f_{\text{rot}})$ and $F_x = \texttt{fft}(f_{\text{ref}})$. - Two $O(n\log n)$ FFTs replace one $O(n^2)$ matrix--vector product. - - \smallskip - - The inverse is analogous: solve for $F_r[k], F_x[k]$ from the four entries, - enforce Hermitian symmetry $F[n{-}k] = \overline{F[k]}$, then \texttt{ifft}. -\end{frame} - -% ============================================================ -\begin{frame}{FFT-based group DFT: 100--275$\times$ speedup} - Replaced $O(n^2)$ explicit DFT (einsum against precomputed rotation matrices) - with two calls to \texttt{torch.fft.fft} / \texttt{torch.fft.ifft}. - - \bigskip - - Key insight: each entry of the $2\times 2$ Fourier coefficient $\hat{f}(\rho_k)$ - is a linear combination of $\operatorname{Re}/\operatorname{Im}$ of the standard FFT - of the rotation and reflection halves of the signal. - - \bigskip - - \begin{table} - \scriptsize - \begin{tabular}{lrrrl} - \toprule - \textbf{Method} & $n$ & \textbf{Before} & \textbf{After} & \textbf{Speedup} \\ - \midrule - \texttt{\_group\_dft} & 64 & 50 ms & 0.23 ms & $218\times$ \\ - \texttt{\_group\_dft} & 256 & 76 ms & 0.28 ms & $275\times$ \\ - \texttt{\_group\_dft} & 1024 & 89 ms & 0.44 ms & $205\times$ \\ - \texttt{\_inverse\_dft} & 64 & 2.3 ms & 0.27 ms & $8.5\times$ \\ - \texttt{\_inverse\_dft} & 256 & 10.5 ms & 0.33 ms & $32\times$ \\ - \texttt{\_inverse\_dft} & 1024 & 71 ms & 0.56 ms & $127\times$ \\ - \bottomrule - \end{tabular} - \end{table} - - Also removes $O(n^2)$ memory from precomputed rotation buffers. -\end{frame} - -% ============================================================ -% SO2onD2 SECTION -% ============================================================ - -\begin{frame}{} - \vfill - \centering - {\Large\textbf{New: SO2onD2}} - - \medskip - - {\normalsize Implementing the Selective Disk Bispectrum} - - \smallskip - - {\small Myers \& Miolane, arXiv:2511.19706, 2025} - \vfill -\end{frame} - -% ============================================================ -\begin{frame}{SO2onD2: What and why} - \textbf{Setting}: $f : \mathbb{D} \to \mathbb{R}$ (grayscale image on the unit disk). - $\mathrm{SO}(2)$ acts by rotation: $(R_\phi f)(r,\theta) = f(r, \theta - \phi)$. - - \medskip - - \textbf{Disk Harmonic Transform} (analog of Fourier/SHT): - \[ - f(r, \theta) = \textstyle\sum_{n,k} a_{nk} \, \psi_{nk}(r, \theta), \qquad - \psi_{nk} = c_{nk} \, J_n(\lambda_{nk} r) \, e^{in\theta} - \] - \textbf{Equivariance}: $a^{R_\phi f}_{n,k} = e^{in\phi} \cdot a^f_{n,k}$ - - \medskip - - \textbf{Selective disk bispectrum} (Def.~4.2) --- $O(m)$ coefficients: - \[ - b_{0,0,k} = a_{0,1}^2 \cdot a_{0,k}^*, \qquad - b_{2,n,k} = a_{1,1} \cdot a_{n,1} \cdot a_{n+1,k}^* - \] - Phases cancel: $e^{i\phi} \cdot e^{in\phi} \cdot e^{-i(n+1)\phi} = 1$. \textbf{Invertible} (Thm.~4.4). -\end{frame} - -% ============================================================ -\begin{frame}{SO2onD2: Architecture} - Follows the same \texttt{nn.Module} contract as \texttt{CnonCn}/\texttt{DnonDn}: - \begin{itemize} - \item No trainable parameters (all buffers) - \item \texttt{forward(f)} takes raw $L \times L$ images, handles DHT internally - \item \texttt{invert(beta)} recovers image up to rotation - \item \texttt{output\_size}, \texttt{index\_map} properties - \end{itemize} - - \bigskip - - \textbf{Key design choices}: - \begin{enumerate} - \item No new dependencies --- Bessel functions from scratch in pure torch - \item No external data files --- all roots \& matrices computed at construction - \item \texttt{selective=False} raises \texttt{NotImplementedError} (as in \texttt{DnonDn}) - \item Mirrors \texttt{CnonCn} structure: $\mathrm{SO}(2)$ is commutative $\Rightarrow$ scalar triple products, no CG matrices - \end{enumerate} -\end{frame} - -% ============================================================ -\begin{frame}{Challenge 1: Bessel functions without scipy} - Need $J_n(x)$ and its positive zeros $\lambda_{nk}$ where $J_n(\lambda_{nk}) = 0$. - - \bigskip - - \textbf{$J_n(x)$}: Forward recurrence from \texttt{torch.special.bessel\_j0/j1}: - \[ - J_{k+1}(x) = \frac{2k}{x} J_k(x) - J_{k-1}(x) - \] - Stable when $x \geq n$ (our regime: $x = \lambda_{nk} r$, $\lambda_{nk} > n$). - - \bigskip - - \textbf{Root finding}: \textbf{Interlacing property} $\lambda_{n-1,k} < \lambda_{n,k} < \lambda_{n-1,k+1}$ gives guaranteed brackets. - - \begin{enumerate} - \item $J_0$ roots via McMahon expansion + Newton polish - \item For $n = 1, 2, \ldots$: bracket each $J_n$ root between consecutive $J_{n-1}$ roots - \item Newton--bisection hybrid within each bracket (guaranteed convergence) - \end{enumerate} - - Single-pass algorithm: \texttt{compute\_all\_bessel\_roots(n\_max, k\_max)}. -\end{frame} - -% ============================================================ -\begin{frame}{Challenge 2: DHT on a discrete pixel grid} - \textbf{Problem}: The natural complex basis $\{\psi_{nk}, \psi_{-n,k}\}$ is redundant for real signals ($\psi_{-n,k} = \overline{\psi_{n,k}}$). On a discrete grid, the synthesis matrix is \emph{rank-deficient} (condition number $\sim 10^{20}$). - - \bigskip - - \textbf{Solution}: Reformulate using a \textbf{real basis}: - \begin{align*} - n = 0: &\quad c_{0k} J_0(\lambda_{0k} r) \hfill \text{(1 column per }(0,k)\text{)} \\ - n > 0: &\quad 2\,c_{nk} J_n(\lambda_{nk} r)\cos(n\theta),\quad -2\,c_{nk} J_n(\lambda_{nk} r)\sin(n\theta) \hfill \text{(2 columns)} - \end{align*} - Yields matrix $\Phi \in \mathbb{R}^{p_{\text{disk}} \times d_{\text{real}}}$, well-conditioned ($\kappa \sim 10^3$). - - \bigskip - - \textbf{Analysis}: $\mathbf{x} = \Phi^+ \mathbf{f}$ \quad (pseudoinverse, \texttt{rcond=1e-10}) - - \textbf{Synthesis}: $\mathbf{f} = \Phi \, \mathbf{x}$ - - \smallskip - - Convert real $\mathbf{x}$ to complex $a_{n,k} = x_{\text{re}} + i\,x_{\text{im}}$ for the bispectrum. -\end{frame} - -% ============================================================ -\begin{frame}{Challenge 3: Bandlimit convention} - Paper says $\lambda = \pi L / 2$, but what determines $m$ exactly? - - \bigskip - - Convention from Marshall et al.\ (2023, \texttt{fle-2d}): - \[ - n_e = \lfloor L^2 \pi / 4 \rfloor \approx \text{number of pixels inside the disk} - \] - Sort all $(n, k)$ by ascending $\lambda_{nk}$, keep the first $n_e$. - - \bigskip - - \textbf{Edge case}: if $n_e$ splits a conjugate pair $(n, k)$ and $(-n, k)$, drop the orphan. - - \bigskip - - \begin{table} - \scriptsize - \begin{tabular}{lccccc} - \toprule - \textbf{Image size} & $L=8$ & $L=16$ & $L=28$ & $L=56$ & $L=112$ \\ - \midrule - Paper (Table 1) & 27 & 105 & 315 & 1{,}247 & 4{,}957 \\ - Our implementation & 27 & 105 & 315 & --- & --- \\ - \bottomrule - \end{tabular} - \end{table} - - \smallskip - - Exact match for all tested sizes. ($L \geq 56$ untested due to construction time.) -\end{frame} - -% ============================================================ -\begin{frame}{Inversion: bootstrap recovery (Thm.~4.4)} - Same pattern as \texttt{CnonCn.invert()}, adapted to 2D indexing: - - \medskip - - \begin{enumerate}\setlength{\itemsep}{1pt} - \item $a_{0,1}$ from $b_{0,0,1} = |a_{0,1}|^3 e^{i\arg(a_{0,1})}$ \quad $\Rightarrow$ \quad cube root - \item $a_{0,k}$ for $k \geq 2$: \quad $a_{0,k} = \overline{b_{0,0,k} / a_{0,1}^2}$ - \item $|a_{1,1}|$ from $b_{2,0,1} = a_{0,1} |a_{1,1}|^2$ \quad (phase = rotation indeterminacy) - \item $a_{1,k}$ for $k \geq 2$: \quad $a_{1,k} = \overline{b_{2,0,k} / (a_{1,1} \cdot a_{0,1})}$ - \item Chain for $n \geq 1$: \quad $a_{n+1,k} = \overline{b_{2,n,k} / (a_{1,1} \cdot a_{n,1})}$ - \end{enumerate} - - \medskip - - \textbf{At the coefficient level}: exact (magnitudes match to $10^{-12}$). - - \textbf{Full roundtrip} ($f \to \beta \to \hat{f} \to f'$): limited by DHT discretization; - ${>}85\%$ of DH coefficients recovered within 20\% relative error. - - \medskip - - \textbf{Assumption}: $a_{n,1} \neq 0$ for all $n$. - Mild for noisy images; fails for purely radial signals. -\end{frame} - -% ============================================================ -\begin{frame}[fragile]{SO2onD2: Usage} -\begin{lstlisting}[language=Python] -from bispectrum import SO2onD2 - -bsp = SO2onD2(L=28) # 28x28 images -print(bsp.output_size) # 315 - -f = torch.randn(4, 28, 28) # batch of 4 images -beta = bsp(f) # (4, 315), complex128 -f_rec = bsp.invert(beta) # (4, 28, 28), float64 - -# Invariance check -cos_a, sin_a = math.cos(0.7), math.sin(0.7) -theta = torch.tensor([[[cos_a, sin_a, 0], - [-sin_a, cos_a, 0]]]) -grid = F.affine_grid(theta, [1,1,28,28]) -f_rot = F.grid_sample(f[:1].unsqueeze(1), grid) - -beta_rot = bsp(f_rot.squeeze(1)) -# beta and beta_rot are approximately equal -\end{lstlisting} -\end{frame} - -% ============================================================ -\begin{frame}{Numerical subtleties encountered} - \begin{enumerate} - \item \textbf{Forward recurrence cancellation}: $J_n(x)$ near its own zeros loses $\sim$7 digits for $n \geq 2$. - Our computed roots are zeros of the \emph{numerically evaluated} $J_n$, not the true $J_n$. - Everything is self-consistent; displacement $\sim 6 \times 10^{-5}$. - - \smallskip - - \item \textbf{dtype leak}: \texttt{torch.tensor(x)} with Python float infers \texttt{float32}, not \texttt{float64}. Silently halved precision of all root-finding. - - \smallskip - - \item \textbf{Phase precision}: \texttt{torch.exp(1j * n * phi)} creates \texttt{complex64} even when multiplied with \texttt{complex128} tensors. Must explicitly pass \texttt{dtype=complex128}. - - \smallskip - - \item \textbf{Pseudoinverse regularization}: 1--2 basis functions per grid are unresolvable (aliased at the pixel scale). Setting \texttt{rcond=1e-10} in \texttt{pinv} zeros their singular values instead of amplifying noise. - \end{enumerate} -\end{frame} - -% ============================================================ -\begin{frame}{Test coverage: 180 tests} - \begin{columns}[T] - \begin{column}{0.48\textwidth} - \textbf{CnonCn} (42 tests) - \begin{itemize}\scriptsize - \item Output shape/dtype (6 values of $n$) - \item Cyclic shift invariance (selective \& full, all shifts) - \item Formula verification vs manual DFT - \item Inversion: DFT magnitude roundtrip - \item Inversion: full bispectrum roundtrip - \end{itemize} - - \bigskip - - \textbf{DnonDn} (67 tests) - \begin{itemize}\scriptsize - \item Rotation invariance (all shifts, 6 values of $n$) - \item Reflection invariance (6 values of $n$) - \item Combined rotation + reflection - \item DFT roundtrip (forward + inverse = identity) - \item Inversion: $\beta_{\rho_0,*}$ exact roundtrip - \item Inversion: Fourier Frobenius norm recovery - \item DFT performance benchmarks ($n$ up to 1024) - \end{itemize} - \end{column} - \begin{column}{0.48\textwidth} - \textbf{SO2onD2} (45 tests) - \begin{itemize}\scriptsize - \item Bessel: $J_n$ vs torch, root accuracy, interlacing - \item Construction: coeff counts vs paper Table~1 - \item Forward: shape, dtype, analytical \& spatial invariance - \item DHT roundtrip: bandlimited \& single harmonic - \item Inversion: coefficient-level, bispectrum roundtrip - \end{itemize} - - \bigskip - - \textbf{Other} (32 tests) - \begin{itemize}\scriptsize - \item SO3onS2: construction, forward, rotation invariance - \item Rotation utilities, import / public API surface - \end{itemize} - \end{column} - \end{columns} -\end{frame} - -% ============================================================ -\begin{frame}{Weaknesses \& areas for improvement} - \begin{enumerate} - \item \textbf{No GPU testing} --- all tests run on CPU only - - \item \textbf{$D_n$ inversion is partial} --- $O(2)$ indeterminacy is fundamental; - worth investigating canonical choices of $Q$ - - \item \textbf{Full bispectrum not implemented} --- only \texttt{selective=True} - works for \texttt{DnonDn} and \texttt{SO2onD2} - - \item \textbf{SO2onD2 construction is slow} --- Bessel root finding + pseudoinverse - in pure Python; $L=28$ takes ${\sim}15$s, $L=64$ impractical - - \item \textbf{Naive DHT} --- $O(L^3)$ pseudoinverse instead of - $O(L^2 \log L)$ fast DHT from Marshall et al.\ (2023) - - \item \textbf{No G-CNN integration yet} --- standalone module, - not wired into an equivariant network pipeline - \end{enumerate} -\end{frame} - -% ============================================================ -\begin{frame}{Next steps} - \begin{itemize} - \item \textbf{SO2onD2: MRA correction} (Proposition 4.6) --- bias term $\delta$ for noisy rotated observations - \item \textbf{SO2onD2: fast DHT} --- integrate $O(L^2 \log L)$ approximation from Marshall et al. - \item \textbf{SO2onD2: performance} --- cache Bessel roots, or move to C++/CUDA - \item Wire into a G-CNN pipeline (replace escnn pooling layer) - \item Reproduce MNIST/EMNIST/CIFAR-10 experiments from the papers - \item Explore octahedral / full octahedral groups (Mataigne Appendix F) - \item Investigate selective bispectrum for $\mathrm{SO}(3)$ on $S^2$ (open problem) - \item GPU testing and benchmarking - \end{itemize} -\end{frame} - -\end{document} diff --git a/docs/bispectral_signatures_of_data.tex b/docs/bispectral_signatures_of_data.tex deleted file mode 100644 index 3bc78f5..0000000 --- a/docs/bispectral_signatures_of_data.tex +++ /dev/null @@ -1,2510 +0,0 @@ -\documentclass{article} -\usepackage[fontsize=10bp]{fontsize} -\usepackage[utf8]{inputenc} -\usepackage[margin=1.0in]{geometry} -\usepackage{amsmath} -\usepackage{amssymb} -\usepackage{amsthm} -\usepackage{subfigure} -\usepackage[parfill]{parskip} -\usepackage{graphicx} -\usepackage[usenames,dvipsnames]{xcolor} -\usepackage{float} -\usepackage{amsfonts} -\usepackage{tcolorbox} -\usepackage{multicol} -\usepackage{wrapfig} -\usepackage{csquotes} -\usepackage[dvipsnames,svgnames,x11names,hyperref]{xcolor} -\definecolor{deepblue}{RGB}{0,35,102} -\definecolor{deepred}{RGB}{139,0,0} -\usepackage[table,xcdraw]{xcolor} - -\usepackage{hyperref} -\hypersetup{ - colorlinks=true, - linkcolor=RoyalPurple, - urlcolor=RoyalPurple, - citecolor=RoyalPurple - } - -\setlength{\belowdisplayskip}{0pt} \setlength{\belowdisplayshortskip}{0pt} -\setlength{\abovedisplayskip}{0pt} \setlength{\abovedisplayshortskip}{0pt} -\usepackage[font=footnotesize,labelfont=bf]{caption} - -\usepackage{floatrow} -\usepackage{hyperref} -\newtheorem{proposition}{Proposition} -\newtheorem{lemma}{Lemma} -\newtheorem{definition}{Definition} -\newtheorem{remark}{Remark} - -\usepackage[superscript,biblabel]{cite} -\linespread{1.0} - - -\title{Bispectral Signatures of Data: The Different Flavors of Bispectra and G-Bispectra} - - -\author{\vspace{-0.8cm}} -\date{} - -\begin{document} - - -\maketitle -\tableofcontents - -\paragraph{Triple correlation on R} The triple correlation of a function $f$ on $\mathbb{R}$ is: -$$ -T(f)\left(t_1, t_2\right):=\int_{\mathbb{R}} f(x)^* f\left(x+t_1\right) f\left(x+t_2\right) d x . -$$ -The triple correlation is translation invariant: if $g(x)=$ $f\left(x-x_0\right)$, then $T_g=T(f)$, as a consequence of the invariance of the integral. - -We note that R is not included in any of the cases here: not finite, not compact, not homogeneous, etc - except the homogeneous x invariant space. - -\section{Preliminaries} - -Throughout the computations that follow, we use the following. - -Properties of representations: -\begin{align*} - \rho(gg') &= \rho(g) \rho(g')\\ - \rho(g^{-1}) = \rho(g)^\dagger -\end{align*} - -Property of tensor product and matrix multiplication: -\begin{equation} - (A \otimes B) . (C \otimes D) = (AC) \otimes (BD) -\end{equation} - -\section{Bispectrum-only Summary} - - -\newpage - \newgeometry{left=0cm,bottom=0cm} -\begin{table}[] -\vspace*{-20mm} -\centering -\rotatebox{90}{ -\scriptsize{ -\begin{tabular}{|l|l|l|} -\hline -\textbf{} & - \textbf{Fourier} & - Bispectrum \\ \hline -\textbf{$Z_n$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_k$\\ $= \sum_{x=0}^{n-1} f(x).e^{-i2\pi k x / n}$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{k_1, k_2} $\\ $= \hat{f}_{k_1}\hat{f}_{k_2}\hat{f}^{\dagger}_{k_1+k_2}$\end{tabular} \\ \hline -\textbf{$G_n$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_\rho$\\ $=\frac{1}{|G|} \sum_{g \in G} f(g) \rho(g)^{\dagger}$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{\rho_1, \rho_2}$\\ $=[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} ] C_{{\rho_1} {\rho_2}}\left[\bigoplus_{\rho \in \rho_1 \otimes \rho_2}\mathcal{F}(f)_\rho\right] C_{{\rho_1} {\rho_2}}^{\dagger}$\end{tabular} \\ \hline -\textbf{$G^c$} & - same as $G$ & - \begin{tabular}[c]{@{}l@{}}$\beta (f)_{\rho_1, \rho_2} $\\ $= \mathcal{F}(f)_{\rho_1} \mathcal{F}(f)_{\rho_2}\mathcal{F}(f)_{\rho_1 \rho_2}^{\dagger}$\end{tabular} \\ \hline -\textbf{$S^2$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}^v(f)_l $\\ $= \kappa_l \int_{R \in SO(3)} f^\dagger(T_R(x_0)). [\rho_l(R)]_0 dR$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta^v(f)_{l_1, l_2}[l]$\\ $:=\left[\mathcal{F}(f)_{l_1} \otimes \mathcal{F}(f)_{l_2} \right] C_{l_1l_2} \mathcal{F}_0(f)_l^{\dagger}$\end{tabular} \\ \hline -\textbf{} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_l $\\ $= \int_{R \in SO(3)} f^\dagger(T_R(x_0)). \rho_l(R) dR$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{l_1l_2} $\\ $= [\mathcal{F}(f)_{l_1} \otimes \mathcal{F}(f)_{l_2}] C_{l_1,l_2} \Big[ \bigoplus_{l \in l_1 \otimes l_2} \mathcal{F}(f)_{l}^{\dagger} \Big] C^{\dagger}_{l_1,l_2}$\end{tabular} \\ \hline -\textbf{$H$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_\rho $\\ $=\int_{g \in G} f\left(T_g(x_0)\right) \rho(g)dg$\end{tabular} & - same as $G$ and $G_n$ \\ \hline -\textbf{$H^c$} & - same as $H$ & - same as $G^c$ \\ \hline -\end{tabular} -} -} -\caption{Summary} -\label{tab:eqns} -\end{table} - -\section{Summary} - -\newpage - \newgeometry{left=0cm,bottom=0cm} -\begin{table}[] -\vspace*{-20mm} -\centering -\rotatebox{90}{ -\scriptsize{ -\begin{tabular}{|l|l|l|l|} -\hline -\textbf{} & - \textbf{Fourier} & - \textbf{Triple Correlation} & - Bispectrum \\ \hline -\textbf{$Z_n$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_k$\\ $= \sum_{x=0}^{n-1} f(x).e^{-i2\pi k x / n}$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{x_1, x_2} $\\ $= \frac{1}{n} \sum_{x \in Z_n}f^*(x)f(x+x_1)f(x+x_2)$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{k_1, k_2} $\\ $= \hat{f}_{k_1}\hat{f}_{k_2}\hat{f}^{\dagger}_{k_1+k_2}$\end{tabular} \\ \hline -\textbf{$G_n$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_\rho $\\ $=\frac{1}{|G|} \sum_{g \in G} f(g) \rho(g)^{\dagger}$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{g_1, g_2}$\\ $=\frac{1}{|G|} \sum_{g \in G} f^*(g) f\left(g g_1\right) f\left(g g_2\right)$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{\rho_1, \rho_2}$\\ $=[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} ] C_{{\rho_1} {\rho_2}}\left[\bigoplus_{\rho \in \rho_1 \otimes \rho_2}\mathcal{F}(f)_\rho\right] C_{{\rho_1} {\rho_2}}^{\dagger}$\end{tabular} \\ \hline -\textbf{$G$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_\rho $\\ $= \int_G f(g)\rho(g) dg$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{g_1, g_2}$\\ $=\int_{g \in G} f^*(g) f\left(g g_1\right) f\left(g g_2\right)dg$\end{tabular} & - same as $G_n$, i.e. as above \\ \hline -\textbf{$G^c$} & - same as $G$ & - same as $G$, i.e. as above & - \begin{tabular}[c]{@{}l@{}}$\beta (f)_{\rho_1, \rho_2} $\\ $= \mathcal{F}(f)_{\rho_1} \mathcal{F}(f)_{\rho_2}\mathcal{F}(f)_{\rho_1 \rho_2}^{\dagger}$\end{tabular} \\ \hline -\textbf{$S^2$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}^v(f)_l $\\ $= \kappa_l \int_{R \in SO(3)} f^\dagger(T_R(x_0)). [\rho_l(R)]_0 dR$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{R_1, R_2} $\\ $= \int_{R\in SO(3)} f^*(T_R(x_0)) f\left(T_{R R_1}(x_0)\right) f\left(T_{R R_2}(x_0)\right)dR$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta^v(f)_{l_1, l_2}[l]$\\ $:=\left[\mathcal{F}(f)_{l_1} \otimes \mathcal{F}(f)_{l_2} \right] C_{l_1l_2} \mathcal{F}_0(f)_l^{\dagger}$\end{tabular} \\ \hline -\textbf{} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_l $\\ $= \int_{R \in SO(3)} f^\dagger(T_R(x_0)). \rho_l(R) dR$\end{tabular} & - Same as above, independent of Fourier transform. & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{l_1l_2} $\\ $= [\mathcal{F}(f)_{l_1} \otimes \mathcal{F}(f)_{l_2}] C_{l_1,l_2} \Big[ \bigoplus_{l \in l_1 \otimes l_2} \mathcal{F}(f)_{l}^{\dagger} \Big] C^{\dagger}_{l_1,l_2}$\end{tabular} \\ \hline -\textbf{$H$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_\rho $\\ $=\int_{g \in G} f\left(T_g(x_0)\right) \rho(g)dg$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{g_1, g_2} $\\ $= \int_{g\in G} f^*(T_g(x_0)) f\left(T_{g g_1}(x_0)\right) f\left(T_{g g_2}(x_0)\right)dg$\end{tabular} & - same as $G$ and $G_n$ \\ \hline -\textbf{$H^c$} & - same as $H$ & - same as $H$, i.e. as above & - same as $G^c$ \\ \hline -\textbf{$D$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_{nm} $\\ $= \frac{1}{a_{n m}} \int_0^{2 \pi} \int_0^1 f(r, \theta) J_m(2 \pi l_{n m} r) \exp(-i m \theta) r d r d\theta$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{R_1, R_2} $\\ $:= \int_{R\in SO(2)} f^*(T_R(\theta_0), r_0) f\left(T_{R R_1}(\theta_0), r_0\right) f\left(T_{R R_2}(\theta_0), r_0\right)dR$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$\beta(f)_{nmm'} $\\ $:= \mathcal{F}(f)_{nm}.\mathcal{F}(f)_{nm'}.\mathcal{F}(f)_{n(m+m')}^\dagger$\end{tabular} \\ \hline -\textbf{$B$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_{l}$\\ $ \propto \int_0^{2 \pi}\int_0^{\pi} \int_0^1 f(r, \theta, \phi)^\dagger \left( r^{\ell} Y_{\ell}(\theta, \phi)\right) r d r \cos(\theta) d\theta d\phi$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{R_1, R_2} $\\ $:= \int_{R\in SO(3)} f^*(T_R(\theta_0, \phi_0), r_0) f\left(T_{R R_1}(\theta_0, \phi_0), r_0\right) f\left(T_{R R_2}(\theta_0, \phi_0), r_0\right)dR$\end{tabular} & - $\beta^v(f)_{l_1, l_2}[l]$, same as $S^2$ \\ \hline -\textbf{$H \times R$} & - \begin{tabular}[c]{@{}l@{}}$\mathcal{F}(f)_{\rho} $\\ $:= \int_{r \in R} \int_{g \in G} f\left(r, T_g(x_0)\right) \rho(g)dg. dr$\end{tabular} & - \begin{tabular}[c]{@{}l@{}}$T(f)_{g_1, g_2} $\\ $:= \int_{g \in G} f^*(T_g(x_0), r_0) f\left(T_{gg_1}(x_0), r_0\right) f\left(T_{gg_2}(x_0), r_0\right)dg$\end{tabular} & - Conjecture: $\beta^v$, same as $H$, \\ \hline -\end{tabular} -} -} -\caption{Summary} -\label{tab:eqns} -\end{table} -\restoregeometry -\newpage -\section{\color{deepblue}{Domain $\Omega = (\mathbb{Z}/n\mathbb{Z},~+)$ (cyclic translations)}} - -\subsection{Fourier Transform: Definition} - -The discrete Fourier transform of a signal $f$ on a space $\Omega$ is defined: - -\vspace{-0.5cm} -\begin{equation} - \hat{f}_k = \sum_{x=0}^{n-1}e^{-i2\pi k x / n} f(x). -\end{equation} -\vspace{-0.5cm} - -From a group theoretic perspective, a Fourier transform is a projection of a signal onto the irreducible representations the group $(\mathbb{Z}/n\mathbb{Z}, +)$ of cyclic translations, indexed by integer frequencies $k$. - -\subsection{Fourier Transform: Equivariance} -This gives it the property of \textit{equivariance} to translation in the input, commonly known as the time-shift and frequency-shift properties. Intuitively, this means that translating the input and then taking the Fourier transform is equivalent to taking the Fourier transform and then phase shifting the output. We expand the shift property of the Fourier transform here for illustration. Define the translate of $f$ by $z$ as $f^z(x) = f(x - z)$. Let $ h = x - z$. Then, The Fourier transform of $f^z(x)$ shifts as follows: - -\vspace{-0.7cm} -\begin{eqnarray*} - \hat{f}^z_k &=& \sum_{x=0}^{n-1}e^{-i2\pi k x / n} f(x - z) \\ -% \hat{f}^z(\omega) &=& \sum_{x=0}^{n-1} e^{\frac{-i2 \pi}{n}x\omega} f(x-z) \\ - \hat{f}^z_k &=& \sum_{h=0}^{n-1}e^{-i2\pi k (z+h) / n} f(h) \\ -% \hat{f}^z(\omega) &=& \sum_{h=0}^{n-1} e^{\frac{-i2 \pi}{n}(z+h)\omega} f(h) \\ - \hat{f}^z_k &=& \sum_{h=0}^{n-1} e^{-i2\pi k z / n} e^{-i2\pi k h / n} f(h) \\ -% \hat{f}^z(\omega) &=& \sum_{h=0}^{n-1} e^{\frac{-i2 \pi}{n}z\omega}e^{\frac{-i2 \pi}{n}h\omega} f(h) \\ - \hat{f}^z_k &=& e^{-i2\pi k z / n} \sum_{h=0}^{n-1} e^{-i2\pi k h / n} f(h) \\ -% \hat{f}^z(\omega) &=& e^{\frac{-i2 \pi}{n}z\omega} \sum_{h=0}^{n-1} e^{\frac{-i2 \pi}{n}h\omega} f(h) \\ -% &=& e^{\frac{-i 2 \pi}{n}z \omega} \hat{f}(\omega) -% \end{eqnarray*} - &=& e^{-i2\pi k z / n} \hat{f}_k. -\end{eqnarray*} -\vspace{-0.7cm} - -That is, the shift is proportional to the translation $z$, by a factor of $e^{\frac{-i 2 \pi}{n} z k}$. Another way of thinking of the Fourier transform is as a homomorphism that maps group actions in the space domain (cyclic translation) to group actions in the frequency domain (complex multiplication). - -\subsection{Steerable Bispectrum: After Convolution on Steerable Basis} - -Question: can we compute the bispectrum more efficiently by formalizing the group convolution on a steerable basis? And recovering the output of the convolution directly in its Fourier form? We try to do it for the simplest bispectrum, i.e. the bispectrum on $\mathbb{Z}/n\mathbb{Z}$. - -Consider a steerable basis for the discrete translations, i.e. the harmonics of the ring, where the ring is discretized into $\mathbb{Z} / n\mathbb{Z}$. - -The basis $ x \mapsto Y_l(x) = e^{ilx}$ is steered by representations $\theta \mapsto \rho_l(\theta) = e^{-il\theta}$, since $Y_l(x - x_0) = \rho_l(-x_0)Y_l(x)$. - -The filters of a convolutional layer are: $\Psi \in \mathbb{C}^{K \times n}$ for $K$ filters, given as their coefficients along the $n$ basis functions $Y_l$, $l=1, ..., n$. Let's consider only one filter for now, denoted $w$. -\begin{align*} - w - &= [\hat{w}^{1}, ..., \hat{w}^{n}] \in \mathbb{C}^n \\ - w(x) - &= \sum_{l=1}^n \hat{w}^{(l)}Y_l(x), \quad \forall x \in \mathbb{Z} / n\mathbb{Z} -\end{align*} - -The convolution between $w$ and a signal $f$ is, on the domain $\mathbb{Z} / n \mathbb{Z}$, is: -\begin{align*} - \Theta(x_0) = (w \ast f) (x_0) - &= \sum_{x \in \mathbb{Z}/n\mathbb{Z}} w(x_0-x).f(x) \\ - &= \sum_{x \in \mathbb{Z}/n\mathbb{Z}} \sum_{l=1}^n \hat{w}^{(l)}Y_l(x_0-x).f(x) \\ - &= \sum_{x \in \mathbb{Z}/n\mathbb{Z}} \sum_{l=1}^n \hat{w}^{(l)}\rho_l(-x). Y_l(x_0).f(x) \\ - &=\sum_{l=1}^n \sum_{x \in \mathbb{Z}/n\mathbb{Z}} \hat{w}^{(l)}\rho_l(-x).f(x).Y_l(x_0) \\ - &=\sum_{l=1}^n \hat{\Theta}_l .Y_l(x_0), - \quad \text{denoting:~} \hat{\Theta}_l \equiv \hat{w}^{(l)} \sum_{x \in \mathbb{Z}/n\mathbb{Z}} \rho_l(-x).f(x), -\end{align*} -with $\hat{\Theta}_l$ the coefficients of the output of the G-convolution, here the classic convolution, on the steerable basis. - -We can directly compute the steerable bispectrum by combining the $\hat{\Theta}_l$ of the output. - - -\subsection{Triple Correlation: Definition} - -$T(f)_{x_1, x_2} = \frac{1}{n} \sum_{x \in Z_n}f^*(x)f(x+x_1)f(x+x_2)$ - -\subsection{Triple Correlation: Symmetries} - -\begin{proposition}[Symmetries] -The triple correlation of a signal has the following symmetry: -\begin{align*} - (s1) \qquad T(f)_{x_1, x_2} &= T(f)_{x_2, x_1} -\end{align*} -The triple correlation of a real signal has the following additional symmetries: -\begin{align*} - (s2) \qquad T(f)_{x_1, x_2} = T(f)_{-x_1, x_2-x_1} = T(f)_{x_2-x_1, -x_1} = T(f)_{x_1-x_2, -x_2} = T(f)_{-x_2, x_1-x_2} -\end{align*} -\end{proposition} - -\begin{proof} - We prove symmetry (s1), which relies on the fact that $f(x+x_2)$ and $f(x+x_1)$ are scalar values that commute: - \begin{align*} - T(f)_{x_2, x_1} - = \frac{1}{n} \sum_{x \in Z_n} f^*(x)f(x+x_2)f(x+x_1) - = \frac{1}{n} \sum_{x \in Z_n} f^*(x)f(x+x_1)f(x+x_2) - = T(f)_{x_2, x_1}. - \end{align*} - We assume that the signal $f$ is real. We prove the first equality of symmetry (s2): - \begin{align*} - T(f)_{-x_1, x_2-x_1} - &= \frac{1}{n} \sum_{x \in Z_n} f^*(x)f(x-x_1)f(x+x_2-x_1) \\ - &= \frac{1}{n} \sum_{x' \in Z_n} f^*(x'+x_1)f(x')f(x'+x_1+x_2-x_1) - \quad \text{(with $x' = x - x_1$, i.e. $x = x'+x_1$)} \\ - &= \frac{1}{n} \sum_{x' \in Z_n} f^*(x'+x_1)f(x')f(x'+x_2) - \quad \text{(because $Z_n$ commutative: $x_2 - x_1 = -x_1 + x_2$)} \\ - &= \frac{1}{n} \sum_{x \in Z_n} f(x+x_1)f(x)f(x+x_2) - \quad \text{($f$ is a real signal, which equals its conjugate)}\\ - &= \frac{1}{n} \sum_{x \in Z_n} f(x)f(x+x_1)f(x+x_2) - \quad \text{($f$ is takes on real values that commute)}\\ - &= \frac{1}{n} \sum_{x \in Z_n} f(x)^*f(x+x_1)f(x+x_2) \\ - &= T(f)_{x_2, x_1} - \end{align*} - The second equality of symmetry (s2) follows using (s1). - The third and fourth equality of symmetry (s2) have the same proof. -\end{proof} - -\begin{wrapfigure}{r}{0.25\textwidth} - \centering - \includegraphics[width=0.25\textwidth]{figs/tc_sectors.png} - \caption{Sectors for the symmetries of the TC $\tau_1 = x_1$ and $\tau_2 = x_2$.} - \label{fig:sectors} -\end{wrapfigure} -As a consequence, knowing the TC in any of the six sectors, I through VI, shown in Fig.~\ref{fig:sectors} would enable us to find the entire TC. These sectors include their boundaries so that, for example, sector $I$ is an infinite wedge bounded by the lines $\tau_2=0$ and $\tau_1=\tau_2, \tau_1 \geq 0$. - - -\subsection{Triple Correlation: Invariance} - -\subsection{Triple Correlation: Continuity} - -When $f_2$ is obtained by a group transformation of $f_1$, we have: -\begin{equation} - f_2 = T_g[f_1] \Leftrightarrow T(f_2) = T(f_1). -\end{equation} - -We explore what happens when $f_2$ is obtained from group-transformation of $f_1$ plus ``noise''. Do we have: -\begin{equation} - f_2 = T_g[f_1] + \epsilon h \Rightarrow T(f_2) = T(f_1) + \epsilon T(h) \qquad? -\end{equation} - - -\begin{remark} - We could also consider the case: -\begin{equation} - f_2 = T_g[f_1] + T'_a[h] \Rightarrow T(f_2) = T(f_1) + ? \qquad? -\end{equation} -i.e. $f_2$ is obtained from group-transformation of $f_1$ plus a residual deformation by $a$ where $a$ is not the group defining the TC. For example, $a$ is from the general linear group. -\end{remark} - -Consider the space $\mathcal{C}^0(G)$ of continuous signals $f$ defined on a compact group $G$. We equip this space with the uniform norm (also called sup norm): $|| f \|_{\infty}=\sup _{g \in G}|f(g)|$ for any $f \in \mathcal{C}^0(G)$. The operation ``computing the TC of $f$ at $g_1, g_2$'' can be expressed as: -$$ -\begin{aligned} -& T: \mathcal{C}^0(G) \rightarrow \mathbb{R} \\ -& f \rightarrow T(f)_{g_1, g2}. -\end{aligned} -$$ - -We prove the Lipschitz continuity of this operation. - -\begin{proposition} There is the following bound on the TC of two signals $f_1, f_2 \in \mathcal{C}^0(G)$ for $G$ a locally compact group. - \begin{align*} - \|T\left(f_1\right)-T(f_2)\|_\infty - \leq \text{vol}(G) \left( \|f_1\|_\infty^2 + \|f_1\|_\infty\|f_2\|_\infty + \|f_2\|_\infty^2\right) \left\|f_1-f_2\right\|_{\infty}. -\end{align*} -This shows the Lipschitz continuity of the TC: - \begin{align*} - \|T\left(f_1\right)-T(f_2)\|_\infty - \leq K \left\|f_1-f_2\right\|_{\infty}. -\end{align*} -where $K = 3 \text{vol(G)}$ if $f_1, f_2$ are the outputs of a $G$-CNN with sigmoid non-linearity; or if $f_1, f_2$ are normalized signals that have max equal to 1. Alternatively, $K$ only depends on the weights of the $G$-CNN if $f_1, f_2$ are out to a $G$-CNN to which normalized signals have been sent. -\end{proposition} - -\begin{proof} - -Take two real signals $f_1$ and $f_2$ defined on a compact group $G$. Take two group elements $g_1, g_2 \in G$: -\begin{align*} - \left|T\left(f_1\right)_{g_1,g_2}-T(f_2)_{g_1,g_2}\right| - &=\left|\int_G f_1(g)f_1(gg_1)f_1(gg_2) dg - \int_G f_2(g)f_2(gg_1)f_2(gg_2) dg\right| \\ - & \leq \int_G\left|f_1(g)f_1(gg_1)f_1(gg_2) - f_2(g)f_2(gg_1)f(_2gg_2)\right| dg \\ - & \leq \text{vol}(G) ||F_3(f_1) - F_3(f_2)\|_{\infty}, -\end{align*} -with notations: $F_3(f)(g) = f(g)f(gg_1)f(gg_2)$ and $||F_3(f_1) - F_3(f_2)\|_{\infty} \equiv \sup_{g \in G} |F_3(f_1)(g) - F_3(f_2)(g)| $. - -We will find an upper bound for $||F_3(f_1) - F_3(f_2)\|_{\infty}$. We have, for any $g$: -\begin{align*} - |F_3(f_1)(g) - F_3(f_2)(g)| - % &= |f_1(g)f_1(gg_1)f_1(gg_2) - f_2(g)f_2(gg_1)f_2(gg_2)|\\ - % &= |f_1(g)f_1(gg_1)f_1(gg_2) - f_1(g)f_1(gg_1)f_2(gg_2) \\ - % &~ + f_1(g)f_1(gg_1)f_2(gg_2) - f_1(g)f_2(gg_1)f_2(gg_2) \\ - % &~ + f_1(g)f_2(gg_1)f_2(gg_2) - f_2(g)f_2(gg_1)f_2(gg_2) |\\ - % &\leq |f_1(g)f_1(gg_1)f_1(gg_2) - f_1(g)f_1(gg_1)f_2(gg_2)| \\ - % & + |f_1(g)f_1(gg_1)f_2(gg_2) - f_1(g)f_2(gg_1)f_2(gg_2)| \\ - % & + |f_1(g)f_2(gg_1)f_2(gg_2) - f_2(g)f_2(gg_1)f_2(gg_2)| \\ - % & = |f_1(g)f_1(gg_1)(f_1(gg_2) -f_2(gg_2))|\\ - % & + |f_1(g)f_2(gg_2) (f_1(gg_1)- f_2(gg_1))| \\ - % & + |f_2(gg_1)f_2(gg_2) (f_1(g)- f_2(g))|\\ - % &\leq \left( |f_1(g)f_1(gg_1)| + |f_1(g)f_2(gg_2)| + |f_2(gg_1)f_2(gg_2)|\right) \left\|f_1-f_2\right\|_{\infty}\\ - &\leq \left( \|f_1\|_\infty^2 + \|f_1\|_\infty\|f_2\|_\infty + \|f_2\|_\infty^2\right) \left\|f_1-f_2\right\|_{\infty} -\end{align*} -using a telescopic sum, the triangle inequality and the definition of $\left\|.\right\|_{\infty}$. - -The above inequality gives an upper bound that is valid for any $g \in G$. As the sup is defined as the lowest upper bound, we get: -\begin{equation} - ||F_3(f_1) - F_3(f)\|_{\infty} \leq \left( \|f_1\|_\infty^2 + \|f_1\|_\infty\|f_2\|_\infty + \|f_2\|_\infty^2\right) \left\|f_1-f_2\right\|_{\infty}. -\end{equation} -and therefore: -\begin{align*} - \left|T\left(f_1\right)_{g_1,g_2}-T(f_2)_{g_1,g_2}\right| - \leq \text{vol}(G) \left( \|f_1\|_\infty^2 + \|f_1\|_\infty\|f_2\|_\infty + \|f_2\|_\infty^2\right) \left\|f_1-f_2\right\|_{\infty}. -\end{align*} -The above inequality gives an upper bound that is valid for any $g_1, g_2 \in G$. As the sup over $G \times G$ is defined as the lower upper bound, we get: -\begin{align*} - \|T\left(f_1\right)-T(f_2)\|_\infty - \leq \text{vol}(G) \left( \|f_1\|_\infty^2 + \|f_1\|_\infty\|f_2\|_\infty + \|f_2\|_\infty^2\right) \left\|f_1-f_2\right\|_{\infty}. -\end{align*} -This proves the Lipschitz continuity of the TC assuming that $f_1, f_2$ belong to a space of bounded signals. - -For example, if the $G$-CNN uses a sigmoid as its nonlinearity, then for all $g \in G$: $|f_1(g)| \leq 1$ and $|f_1(g)| \leq 1$, and the above inequality proves the Lipschitz continuity of the TC with constant $K=3\text{vol}(G)$. - -If the $G$-CNN has no nonlinearity, we recall its inputs are images with normalized intensity between 0 and 1. Thus, we can compute an upper bound of $\|f_1\|_\infty$ and $\|f_2\|_\infty$ that only depends on the (learned) weights of the $G$-CNN, and proves the Lipschitz continuity using this constant. -\end{proof} - - - -\subsection{Bispectrum: Definition} - -The Bispectrum is the Fourier transform of the triple correlation. Inserting the formula for the Fourier transform above, and simplifying (see details in compact groups proof): -\begin{align*} - \beta(f)_{k_1, k_2} - &= - \frac{1}{n^3}\sum_{x_1 \in Z_n} \sum_{x_2 \in Z_n} - T(f)(x_1, x_2)\left[ - \rho_1(x_1)^{\dagger} \otimes \rho_2(x_2)^{\dagger} - \right]\\ - &= - \frac{1}{n^3}\sum_{x_1 \in Z_n} \sum_{x_2 \in Z_n} - \left(\sum_{x \in Z_n} - f^*(x) - f\left(x + x_1\right) f\left(x+ x_2\right)\right) - \left[ - \rho_1(x_1)^{\dagger} \otimes \rho_2(x_2)^{\dagger} - \right]\\ - &= \frac{1}{n} - \sum_{x \in Z_n} f^*(x) - [\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}] - \left[ - \rho_1(x) \otimes \rho_2(x) - \right]\\ - &= \mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} - \left[ - \frac{1}{n} - \sum_{x \in Z_n} f(x)^* \rho_1(x) \otimes \rho_2(x) - \right] \\ - &= -\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} C_{{\rho_1} {\rho_2}} - \left[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - \mathcal{F}(f)_\rho - \right] C_{{\rho_1} {\rho_2}}^{\dagger} . -\end{align*} -where each representation $\rho_j$ is associated with and integer $k_j$ such that: $\rho_1(x') = \exp(-i\frac{2\pi x'}{k_1})$ and $\rho_2(x') = \exp(-i\frac{2\pi x'}{k_2})$ for any $x' \in Z_n$. - - -For a pair of frequencies $k_1$ and $k_2$, the bispectrum $\beta$ is defined: - -\begin{equation} -\beta_{k_1, k_2} = \hat{f}_{k_1}\hat{f}_{k_2}\hat{f}^{\dagger}_{k_1+k_2}, -\end{equation} - -with the summation $k_1+k_2$ taken modulo the dimension of the signal. Due to the conjugated third term, any absolute phase shifts resulting from translations in the input cancel out, leaving the bispectrum invariant. - -\subsection{Bispectrum: Invariance} - - -Under translation, $\beta$ becomes: - -\vspace{-1cm} -\begin{eqnarray*} -\beta^z_{k_1, k_2} &=& e^{-i 2 \pi k_1 z / n} \hat{f}_{k_1} e^{-i 2 \pi k_2 z/ n} \hat{f}_{k_2} e^{i 2 \pi (k_1+k_2) z / n} \hat{f}^{\dagger}_{k_1 + k_2} \\ - &=& e^{-i 2 \pi k_1 z / n} e^{-i 2 \pi k_2 z/ n} e^{i 2 \pi k_1 z / n} e^{i 2 \pi k_2 z / n}\hat{f}_{k_1} \hat{f}_{k_2} \hat{f}^{\dagger}_{k_1 + k_2} \\ - &=& \hat{f}_{k_1} \hat{f}_{k_2} \hat{f}^{\dagger}_{k_1 + k_2} -\\ &=& \beta_{k_1, k_2}. -\end{eqnarray*} - - -\subsection{Bispectrum: Signal Reconstruction} - -We answer the question: given the bispectrum $\beta(f)$, what is the minimum number of bispectral coefficients that we need to recover the signal $f$? - -\begin{proposition} - The $n+1$ coefficients $\beta(f)_{0, 0}, \beta(f)_{1, 0}, ...., \beta(f)_{1, n}$ are enough to recover the signal $f$. -\end{proposition} - -\begin{lemma} - We have the following relationships between bispectral coefficients: - \begin{align*} - \beta_{0, 0} - &= \hat{f}_{0}\hat{f}_{0}\hat{f}^{\dagger}_{0} - = \hat{f}_{0} | \hat{f}_{0} |^2 \quad \rightarrow |\beta_{0, 0}| = |\hat{f}_{0}|^3\\ - \beta_{1, 0} - &= \hat{f}_{1} \hat{f}_{0} \hat{f}^{\dagger}_{1} - = \hat{f}_{0} | \hat{f}_{1} |^2, \\ - \beta_{k, 0} - &= \hat{f}_{k} \hat{f}_{0} \hat{f}^{\dagger}_{k} = \hat{f}_{0} |\hat{f}_{k}|^2 \\ - \beta_{1, k-1} - &= \hat{f}_{1} \hat{f}_{k-1} \hat{f}^{\dagger}_{k} . - \end{align*} -\end{lemma} - -\begin{proof} - We show that the $n+1$ coefficients $\beta(f)_{0, 0}, \beta(f)_{1, 0}, ...., \beta(f)_{1, n}$ are enough to recover the Fourier transform $\hat f$ of the signal $f$. - - The $\beta(f)_{0, 0}$ allows us to recover the DC component: - \begin{equation} - |\hat f (0)| = |\beta(f)_{0, 0}|^{1/3}, \quad \text{arg}(\hat f(0)) = \text{arg}(\beta_{0, 0}). - \end{equation} - - We compute the initialization of the recurrence, i.e. the first frequency $\hat f (1)$: - \begin{equation} - | \hat f (1)| = \left(\frac{\beta_{1, 0}}{ \hat{f}_{0} }\right)^{1/2}, \quad \text{arg}(\hat f(1)) = 0, - \end{equation} - We note that we could equally set $\text{arg}(\hat f(1)) = \phi$ for any $\phi \in [0, 2\pi)$. This indeterminacy is inevitable, since it is a reflection of translation invariance~\cite{kondor2008thesis}. - - Next, we compute the Fourier coefficients of $f$ iteratively, from the lowest frequency to the highest: - \begin{equation} - \hat f (k) = \sqrt{\frac{\beta_{1, k-1}}{ \hat{f}_{1} \hat{f}_{k-1} }}^\dagger. - \end{equation} -\end{proof} - - -\section{\color{deepblue}{Domain $\Omega = (G,~+)$ (finite groups)}} - -\subsection{Fourier Transform: Definition} - -The (matrix-valued) Fourier transform on $G$ is defined by coefficients -$$ -F(\omega)=\frac{1}{|G|} \sum_{g \in G} f(g) D_\omega(g)^{\dagger} . -$$ - - -\subsection{Fourier Transform: Equivariance} - -\subsection{Steerable Bispectrum: After G-Conv on Steerable Basis} - -Consider the general case where $\{Y_l\}_l$ is a basis of steerable functions on a domain $\mathbb{\Omega}$ for a group $G$. That is the vector of stacked functions $Y$ is such that: $Y(g.x) = \rho(g)Y(x)$ for $\rho(g) \in \mathbb{C}^{L \times L}$ a representation of the group element $g$. We assume that such a basis exists. - -We would like to compute the bispectrum to get a complete invariance for the action of the group $G$. We write the group convolution: -\begin{align*} - \Theta(g_0) = (w \ast f)(g_0) - &= \sum_{x \in \Omega} - w(g_0^{-1}.x).f(x) \\ - &= \sum_{x \in \Omega} - \sum_{l=1}^L \hat{w}^{l}Y_l(g_0^{-1}.x).f(x) \\ - &= \sum_{x \in \Omega} - \hat{w}^T.Y(g_0^{-1}.x).f(x) \\ - &= \sum_{x \in \Omega} - \left(\hat{w}^T.\rho(g_0)^{-1}.Y(x)\right).f(x) \\ - &= \sum_{x \in \Omega} - \left(\hat{w}^T.\rho(g_0)^T.Y(x)\right).f(x),\quad \text{(assuming $\rho$ unitary)} \\ - &= \sum_{x \in \Omega} - \left((\rho(g_0)\hat{w})^T.Y(x)\right).f(x),\\ - &= \sum_{x \in \Omega} \sum_{l=1}^L - \left((\rho(g_0)\hat{w})_l.Y_l(x)\right).f(x),\\ - &= \sum_{l=1}^L \left( - \sum_{x \in \Omega} - Y_l(x).f(x) \right)(\rho(g_0)\hat{w})_l,\\ - % &= (\rho(g_0)\hat{w})^T \sum_{x \in \Omega} - % Y(x).f(x),\quad\text{(with $Y(x) \in \mathbb{C}^L$ and $f(x) \in \mathbb{R}$)}.\\ -\end{align*} -which ressembles a fourier decomposition: -\begin{equation} - \Theta(x) = \sum_{l=1}^L \hat \Theta_l . Y_l(x) -\end{equation} - -We would like to get the coefficients of $\hat{\Theta}$ on a steerable basis of the domain. However, the domain has changed. And we don't have a steerable basis of this new domain. - -For the bispectrum, we would want the coefficients of $\Theta$ on a "basis" that is indexed by the irreducible representations of the group. Because the spectral coefficients are not indexed by $l$ anymore. - -However, if we consider a case where the action is such that the output of the group convolution has the same domain as the input. Then we can use the same basis functions. - - -\subsection{Triple Correlation: Definition} - -The triple correlation of a function $f$ defined on a finite group $G$ is: -$$ -T(f)_{g_1, g_2}=\frac{1}{|G|} \sum_{g \in G} f^*(g) f\left(g g_1\right) f\left(g g_2\right) . -$$ - -\subsection{Triple Correlation: Invariance} -Note that $T(f)$ is a function defined on $G \times G$, and that, like the autocorrelation, the triple correlation is invariant under left translation: $T(f_1)=T(f_2)$ if $f_1(g)=f_2(h g)$. - -\subsection{Triple Correlation: Symmetries} - -\begin{proposition}[Symmetries] -The triple correlation of a signal has the following symmetry: -\begin{align*} - (s1) \qquad T(f)_{g_1, g_2} &= T(f)_{g_2, g_1} -\end{align*} -If $G$ is commutative, the triple correlation of a real signal has the following additional symmetries: -\begin{align*} - (s2) \qquad T(f)_{g_1, g_2} - = T(f)_{g^{-1}_1, g_2g^{-1}_1} - = T(f)_{g_2g^{-1}_1, g^{-1}_1} - = T(f)_{g_1g^{-1}_2, g^{-1}_2} - = T(f)_{g^{-1}_2, g_1g^{-1}_2} -\end{align*} -\end{proposition} - - -\begin{proof} - We prove symmetry (s1), which relies on the fact that $f(gg_2)$ and $f(gg_1)$ are scalar values that commute: - \begin{align*} - T(f)_{g_2, g_1} - = \frac{1}{|G|} \sum_{g \in G} f^*(g)f(gg_2)f(gg_1) - = \frac{1}{|G|} \sum_{g \in G} f^*(g)f(gg_1)f(gg_2) - = T(f)_{g_2, g_1}. - \end{align*} - We assume that the signal is real and that $G$ is commutative. - We prove the first equality of symmetry (s2): - \begin{align*} - T(f)_{g^{-1}_1, g_2g^{-1}_1} - &= \frac{1}{|G|} \sum_{g \in G} f^*(g)f(gg^{-1}_1)f(gg_2g^{-1}_1) \\ - &= \int_{g' \in G} f^*(g'g_1)f(g')f(g'g_1g_2g^{-1}_1) - \quad \text{(with $g' = g - g_1$, i.e. $g = g'g_1$)} \\ - &= \int_{g' \in G} f^*(g'g_1)f(g')f(g'g_2) - \quad \text{(because $G$ commutative: $g_2 g^{-1}_1 = g^{-1}_1 g_2$)} \\ - &= \frac{1}{|G|} \sum_{g \in G} f(gg_1)f(g)f(gg_2) - \quad \text{($f$ is a real signal, which equals its conjugate)}\\ - &= \frac{1}{|G|} \sum_{g \in G} f(g)f(gg_1)f(gg_2) - \quad \text{($f$ is takes on real values that commute)}\\ - &= \frac{1}{|G|} \sum_{g \in G} f(g)^*f(gg_1)f(gg_2) \\ - &= T(f)_{g_2, g_1} - \end{align*} - The second equality of symmetry (s2) follows using (s1). - The third and fourth equality of symmetry (s2) have the same proof. -\end{proof} - -\subsection{Bispectrum: Definition} - -The bispectrum formula for arbitrary finite groups: -\begin{equation} -\beta(f)_{\rho_1, \rho_2} -= -\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} C_{{\rho_1} {\rho_2}} - \left[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - \mathcal{F}(f)_\rho - \right] C_{{\rho_1} {\rho_2}}^{\dagger} . -\end{equation} - - -\begin{proof} -We prove this by applying the Fourier transform to the triple correlation formula, following Karala. Note that the proof over compact (non-necessarily finite) groups will be similar (actually, this proof here can be deduced from the compact one). - -The Fourier transformation of $T(f)$ requires Kronecker (tensor) products of the representation matrices $\left\{D_\omega\right\}_{\omega \in \Omega}$. The bispectrum is obtained by the formula: -\begin{equation} - \beta(f)_{\rho_1, \rho_2} - = - \frac{1}{|G|^2} \sum_{g_1 \in G} \sum_{g_2 \in G} - T(f)_{g_1, g_2} \rho_1(g_1)^{\dagger} \otimes \rho_2(g_2)^{\dagger} -\end{equation} -for all ${\rho_1}, {\rho_2}$. Note: Karala uses $|G|$ but it's probably $|G|^2$? - -Inserting the formula for the Fourier transform above, and simplifying (see details in compact groups proof): -\begin{align*} - \beta(f)_{\rho_1, \rho_2} - &= - \frac{1}{|G|^3}\sum_{g_1 \in G} \sum_{g_2 \in G} \sum_{g \in G} - f^*(g) - f\left(g g_1\right) f\left(g g_2\right) - \left[ - \rho_1(g_1)^{\dagger} \otimes \rho_2(g_2)^{\dagger} - \right] \\ - &= \frac{1}{|G|} - \sum_{g \in G} f^*(g) - [\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}] - \left[ - \rho_1(g) \otimes \rho_2(g) - \right]\\ - &= \mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} - \left[ - \frac{1}{|G|} - \sum_{g \in G} f(g)^* \rho_1(g) \otimes \rho_2(g) - \right] \\ - &= -\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} C_{{\rho_1} {\rho_2}} - \left[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - \mathcal{F}(f)_\rho - \right] C_{{\rho_1} {\rho_2}}^{\dagger} . -\end{align*} -where the last line is the Clebsh Gordan decomposition on $\rho_1 \times \rho_2$ and subsequent application of the definition of the Fourier transform. - -The formula simplifies if $G$ is commutative. (TODO: proof?). - -\end{proof} - -\subsection{Bispectrum: Invariance} - -\subsection{Bispectrum: Signal Reconstruction} - -For the definition of the bispectrum, we take the convention with the transpose conjugate is on the first term, as in Eq 7.5 p 86 of Kondor thesis. - -% SO2: C4 = Z/4Z -> OK - -% Need the reduction for these three -% O2: D4 - -% D16 is the real goal: 8 rotations and 1 relfections - -% SO3: Octahedral group with 24 elements -% https://en.wikipedia.org/wiki/Octahedral_symmetry -% O3: no chirality, with 48 elements -% --> Look into the e2cnn library / Weiler's work - - -We generalize to the non-commutative case. We show that we recover the signal $f$ from its bispectral coefficients. We follow the same strategy as in the discrete, commutative case: we show that we can recover the Fourier transform of the signals for every irreducible representation $\rho$ of the group. We recover the signal itself by inverse Fourier transform. We first need to know ``how many'' irreducible representations the group has. For finite groups, this number is finite. We use the following - - \begin{proposition} - The number of irreducible representations for a finite group $G$ is equal to the number of conjugacy classes. If $G$ is abelian, the number of irreducible representations is equal to $|G|$ and each representation is 1-dimensional. - \end{proposition} - -\begin{proof} - We recall that the conjugacy class of an element $g \in G$ is defined with the conjugation operation defined by inner automorphisms: - \begin{equation} - C(g) = \{ hgh^{-1} ~|~ \forall h \in G\}. - \end{equation} - - To prove the proposition in its entirety would require delving deep into the theory, but the core idea relies on the orthogonality relations of the character table of the group. The rows of the character table correspond to irreducible characters (which, over the complex numbers, can be associated with irreducible representations), while the columns correspond to conjugacy classes. Whether the group is commutative or not, this result holds. However, for commutative (or abelian) groups, every element is its own conjugacy class. -\end{proof} - -We note that for Lie groups, this might not hold. For example, the group SO(3) has one irreducible representation in each odd dimension: it has an infinite number of irreps. We will deal with this case later. - -We first show relationships between the bispectral coefficients and the Fourier coefficients. We denote $\rho_0$ the trivial representation, which is the representation that sends every group element to the identity matrix, i.e. to the scalar 1 by irreducibility of the $\rho$'s. - -\begin{lemma}\label{lem:coefs} - For $\rho_0$ the trivial representation of the group $G$, and $\rho$ any other irreducible representation of dimension $D$, the bispectral coefficients write: - \begin{align*} - \beta_{\rho_0, \rho_0} - &= |\mathcal{F}(f)_{\rho_0}|^2 \mathcal{F}(f)_{\rho_0} - \in \mathbb{C}\\ - \beta_{\rho, \rho_0} - &= \mathcal{F}(f)_{\rho_0}^\dagger - \mathcal{F}(f)_{\rho}^\dagger\mathcal{F}(f)_{\rho} - \in \mathbb{C}^{D \times D}. - \end{align*} -\end{lemma} - -\begin{proof} - Take $\rho_0$ the trivial representation, we know that $\rho \otimes \rho_0 = \rho$ such that the Clebsh-Gordan decomposition: - \begin{equation} - \rho \otimes \rho_0 = C_{{\rho} {\rho_0}}\left[ - \bigoplus_{\rho' \in \rho \otimes \rho_0} - \rho' - \right] C_{{\rho} {\rho_0}}^{\dagger} = C_{{\rho} {\rho_0}} - \rho C_{{\rho} {\rho_0}}^{\dagger} - \end{equation} - gives: $C_{{\rho} {\rho_0}} C_{{\rho} {\rho_0}}^{\dagger} = 1$ for any irreps $\rho$. In addition, for $\rho = \rho_0$, the Clebsh-Gordan matrices are scalars. Actually, in this case, the CJ matrix is just the identity matrix (according to chatGPT). - - We compute the bispectral coefficient: - \begin{align*} - \beta_{\rho_0, \rho_0} - &= - (\mathcal{F}(f)_{\rho_0} \otimes \mathcal{F}(f)_{\rho_0})^\dagger C_{{\rho_0} {\rho_0}} - \left[ - \bigoplus_{\rho \in \rho_0 \otimes \rho_0} - \mathcal{F}(f)_\rho - \right] C_{{\rho_0} {\rho_0}}^{\dagger} \\ - &= - (\mathcal{F}(f)_{\rho_0} \otimes \mathcal{F}(f)_{\rho_0})^\dagger C_{{\rho_0} {\rho_0}} - \mathcal{F}(f)_{\rho_0} - C_{{\rho_0} {\rho_0}}^{\dagger} - \qquad \text{($\rho_0 \otimes \rho_0 = \rho_0$ which is irreducible)} - \\ - &= - (\mathcal{F}(f)_{\rho_0}^2)^\dagger C_{{\rho_0} {\rho_0}} - \mathcal{F}(f)_{\rho_0} - C_{{\rho_0} {\rho_0}}^{\dagger} - \qquad \text{($\mathcal{F}(f)_{\rho_0}$ is a scalar for which tensor product is multiplication)} - \\ - &=(\mathcal{F}(f)_{\rho_0}^\dagger)^2 \mathcal{F}(f)_{\rho_0} - C_{{\rho_0} {\rho_0}} C_{{\rho_0} {\rho_0}}^{\dagger} - \qquad\text{(scalars commute with other elements)}\\ - &=|\mathcal{F}(f)_{\rho_0}|^2 \mathcal{F}(f)_{\rho_0} - \qquad\text{($C_{{\rho_0} {\rho_0}} C_{{\rho_0} {\rho_0}}^{\dagger} = 1$).} - \end{align*} - - Take any irreducible representation $\rho$ of dimension $D$, we have: - \begin{align*} - \beta_{\rho, \rho_0} - &= (\mathcal{F}(f)_{\rho} \otimes \mathcal{F}(f)_{\rho_0})^\dagger C_{{\rho} {\rho_0}} - \left[ - \bigoplus_{\rho \in \rho \otimes \rho_0} - \mathcal{F}(f)_\rho - \right] C_{{\rho} {\rho_0}}^{\dagger} \\ - &= \mathcal{F}(f)_{\rho_0}^\dagger \mathcal{F}(f)_{\rho}^\dagger C_{{\rho} {\rho_0}} - \mathcal{F}(f)_{\rho} C_{{\rho} {\rho_0}}^{\dagger} \\ - &=\mathcal{F}(f)_{\rho_0}^\dagger \mathcal{F}(f)_{\rho}^\dagger\mathcal{F}(f)_{\rho} \qquad\text{(CJ coefficients for $\rho, \rho_0$ are identity matrices)}. - \end{align*} - \end{proof} - -\begin{proposition} - Consider a finite group $G$ that is non abelian. Consider the $L$ bispectral coefficients of an unknown signal $f$, where $L$ is a number computed from the Kroneck product table of the group. We can recover the Fourier coefficients of $f$ from only $L$ bispectral coefficients. -\end{proposition} - - -\begin{proof} - We consider first Fourier coefficient (DC component), i.e the Fourier transform of the signal at the trivial representation $\rho_0$: - \begin{equation} - \mathcal{F}(f)_{\rho_0} = \hat{f}_{\rho_0} = \int_G f(g)\rho_0(g) dg = \int_G f(g) dg \in \mathbb{C} - \end{equation} - Using Lemma~\ref{lem:coefs}, we can recover it from the ``first'' bispectral coefficient, as: - \begin{equation} - | \mathcal{F}(f)_{\rho_0}| = \left(|\beta_{\rho_0, \rho_0}|\right)^{1/3}, - \quad - \text{arg}(\mathcal{F}(f)_{\rho_0}) = \text{arg}(\beta_{\rho_0, \rho_0}), - \end{equation} - which mirrors the commutative case. - - We consider another Fourier coefficient $\mathcal{F}(f)_{\rho_1}$ for a representation $\rho_1$ of dimension $D$. The coefficient is a matrix in $\mathbb{C}^{D \times D}$. Using Lemma~\ref{lem:coefs}, we can recover it from a bispectral coefficient: - \begin{equation} - \mathcal{F}(f)_{\rho}^\dagger\mathcal{F}(f)_{\rho} - = \frac{\beta_{\rho, \rho_0}}{\mathcal{F}(f)_{\rho_0}^\dagger} \in \mathbb{C}^{D \times D}, - \end{equation} - where the denominator is a scalar in the equation above. The matrix $\mathcal{F}(f)_{\rho}^\dagger\mathcal{F}(f)_{\rho}$ is hermitian, and admits a square-root. We recover the Fourier coefficient as this square-root: - \begin{equation} - \mathcal{F}(f)_{\rho}' - = \left(\frac{\beta_{\rho, \rho_0}}{\mathcal{F}(f)_{\rho_0}^\dagger} - \right)^{1/2}. - \end{equation} - The square-root only recovers $\mathcal{F}(f)_{\rho}$ up to a matrix factor: this is an unidentifiability similar to the commutative case. Specifically, consider the SVD decomposition of $\mathcal{F}(f)_{\rho}$: - \begin{align*} - \mathcal{F}(f)_{\rho} - &= U.\Sigma.V^\dagger\\ - \Rightarrow - \mathcal{F}(f)_{\rho}^\dagger\mathcal{F}(f)_{\rho} - &= (U.\Sigma.V^\dagger)^\dagger. U.\Sigma.V^\dagger - = V \Sigma^2 V^\dagger\\ - \Rightarrow - \mathcal{F}(f)_{\rho}' - &= V \Sigma V^\dagger - \end{align*} - Thus, we have: $\mathcal{F}(f)_{\rho} = UV^\dagger.\mathcal{F}(f)_{\rho}' $ where $U, V$ are unitary matrices that come from the (unknown) SVD decomposition of the (unknown) $\mathcal{F}(f)_{\rho}$. By recovering $\mathcal{F}(f)_{\rho}$ as $\mathcal{F}(f)_{\rho}'$, we fix $UV^\dagger=I$ in the same way that we have fixed $\phi = 0$ (rotation of angle 0, i.e. the identity) in the commutative case. - - We seek to find the Fourier coefficient for another representation $\rho_2$. We operate as we would in the commutative case: we write the bispectral coefficient for $\rho_1, \rho_1$. (Note: we can recover it, up to unitary transformation. We only have to find what its UV is.) We denote $\mathcal{R}$ the (finite) set of irreducible representations of the group $G$. - \begin{align*} - \beta_{\rho_1, \rho_1} - &= - (\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_1})^\dagger C_{{\rho_1} {\rho_1}} - \left[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_1} - \mathcal{F}(f)_\rho - \right] C_{{\rho_1} {\rho_1}}^{\dagger}\\ - &= - (\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_1})^\dagger - C_{{\rho_1} {\rho_1}} - \left[ - \bigoplus_{\rho \in \mathcal{R}} - \mathcal{F}(f)_\rho^{n_{\rho, \rho_1}} - \right] C_{{\rho_1} {\rho_1}}^{\dagger}, - \end{align*} - where $n_{\rho, \rho_1}$ is the multiplicity of irreps $\rho$ in the decomposition of $\rho_1, \rho_1$. If we know the group $G$ a priori, then we can compute the decomposition of $\rho_1$ into its irreps and we know what this is. - - We get the equation: - \begin{equation} - \bigoplus_{\rho \in \mathcal{R}} - \mathcal{F}(f)_\rho^{n_{\rho, \rho_1}} - = C_{{\rho_1} {\rho_1}}^{-1}(\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_1})^{-\dagger} \beta_{\rho_1, \rho_1} C_{{\rho_1} {\rho_1}}^{-\dagger}, - \end{equation} - where we know everything on the right hand side. - Therefore, every Fourier coefficient $\mathcal{F}(f)_\rho$ that appears in the decomposition of $\rho_1 \otimes \rho_1$ into irreducible irreps $\rho$ can be computed, by reading off the elements of the block diagonal matrix. We get the $\mathcal{F}(f)_\rho$ for which $n_{\rho, \rho_1} \neq 0$. - In the commutative case, this is how we get $\rho_2$. - Here, we assume that we get at least one other Fourier coefficient, for a $\rho_2$ that we fix. - - We can then compute: - \begin{align*} - \beta_{\rho_1, \rho_2} - &= - (\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})^\dagger C_{{\rho_1} {\rho_2}} - \left[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - \mathcal{F}(f)_\rho^{n_{\rho, \rho_2}} - \right] C_{{\rho_1} {\rho_2}}^{\dagger} - \end{align*} - to get the equation: - \begin{equation} - \bigoplus_{\rho \in \mathcal{R}} - \mathcal{F}(f)_\rho^{n_{\rho, \rho_2}} - = C_{{\rho_1} {\rho_2}}^{-1}(\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})^{-\dagger} \beta_{\rho_1, \rho_2} C_{{\rho_1} {\rho_2}}^{-\dagger}, - \end{equation} - where everything on the right-hand side is known. We note that, for arbitrary groups and their representations, Clebsch–Gordan matrices are not known in general. Yet we assume that we know them for the groups that we consider, i.e. we have computed them numerically (possible, according to Wikipedia). - - - Therefore, every Fourier coefficient $\mathcal{F}(f)_\rho$ that appears in the decomposition of $\rho_1 \otimes \rho_1$ into irreducible irreps $\rho$ can be computed, by reading off the elements of the block diagonal matrix. We get the $\mathcal{F}(f)_\rho$ for which $n_{\rho, \rho_2} \neq 0$. - - We iterate this procedure. The remaining question is: do we get all of the irreps in this way? If so: how many iterations do we need? The answer is that it depends on its CJ matrices. - - If we know the group a priori, we can compute the Kronecker product table for $G$, where at row $i$ and column $j$ we list all of the irreps that appear in the decomposition of $\rho_i \otimes \rho_j$. - - We want to compute $m_i$ i.e. the multiplicity $\rho_i$ in the decomposition $\tilde \rho = \rho_j \otimes \rho_k$. We present a simple computational procedure, inspired by Cohen \& Welling 2017, that can be used to determine that multiplicity. - - This procedure relies on the character $\chi_{\tilde \rho}(g)=\operatorname{Tr}(\tilde \rho(g))$ of the representation to be decomposed. The most important fact about characters is that the characters of irreps $\rho_i, \rho_j$ are orthogonal: - \begin{equation} - \left\langle\chi_{\rho_i,}, \chi_{\rho_k}\right\rangle \equiv \frac{1}{|G|} \sum_{h \in G} \chi_{\rho_i}(h) \chi_{\rho_k}(h)=\delta_{i k} . - \end{equation} - Furthermore, since the trace of a direct sum equals the sum of the traces (i.e. $\chi_{\rho \oplus \rho^{\prime}}=\chi_\rho+\chi_{\rho^{\prime}}$ ), and every representation $\rho$ is a direct sum of irreps, it follows that we can obtain the multiplicity of - irrep $\rho_i$ in $\tilde \rho$ by computing the inner product with the $i$-th character: - $$ - \left\langle\chi_{\tilde \rho}, \chi_{\rho_i}\right\rangle - = - \left\langle\chi_{\oplus_j m_j \rho_j}, \chi_{\rho_i}\right\rangle=\left\langle\sum_j m_j \chi_{\rho_j}, \chi_{\rho_i}\right\rangle - = - \sum_j m_j\left\langle\chi_{\rho_j}, \chi_{\rho_i}\right\rangle - =m_i - $$ - So the dot product of characters is all we need to determine the multiplicities that we need. - - - \begin{table}[] - \centering - \begin{tabular}{|l|l|l|l|l|} - \hline - $\otimes$ & $\rho_0$ & $\rho_1$ & $\rho_2$ & $\rho_3$ \\ \hline - $\rho_0$ & $(1, 0, 0, 0)$ & $(0, 1, 0, 0)$ & $(0, 0, 1, 0)$ & $(0, 0, 0, 1)$ \\ \hline - $\rho_1$ & $(0, 1, 0, 0)$ & $(m_k^{11})_k$ & $(m_k^{12})_k$ & $(m_k^{13})_k$ \\ \hline - $\rho_2$ & $(0, 0, 1, 0)$ & $(m_k^{21})_k$ & $(m_k^{22})_k$ & $(m_k^{23})_k$ \\ \hline - $\rho_3$ & $(0, 0, 0, 1)$ & $(m_k^{31})_k$ & $(m_k^{32})_k$ & $(m_k^{33})_k$ \\ \hline - \end{tabular} - \caption{} - \label{tab:my-table} - \end{table} - - Once we have the Kronecker product table, then we can see how many bispectral coefficients we need to implement. This will depend on the group. If there are irreps missing from the row of $\rho_1$, then the answer is that we will need more than the tensor products of the form $\rho_1 \otimes \rho_j$ to get all of the coefficients. We might need to consider others of the form $\rho_1$. - - We consider the following procedure. - \begin{itemize} - \item List = $[\rho1]$ - \item Compute $\rho_1 \otimes \rho_1$. - \item Take all the irreps that are not in List that appears in that decomposition. - \item For every such irrep $\rho_2$: - \begin{itemize} - \item Compute $\rho_1 \otimes \rho_2$ - \item Append $\rho_2$ to List. - \item Take all the irreps that are not in List that appears in that decomposition. - \item For every such irrep $\rho_3$: - \begin{itemize} - \item Compute $\rho_1 \otimes \rho_3$ - \item Append $\rho_3$ to List. - \item etc - \end{itemize} - \end{itemize} - \end{itemize} - - We wonder whether this procedure gives us all the irreps of the group, and if so, in how many steps L. The number of steps is the number of bispectral coefficients needed. - - The proposed procedure essentially uses a breadth-first search algorithm on the space of irreducible representations, starting with $\rho_1$ and using the tensor product with $\rho_1$ as the mechanism to explore the space. Whether this procedure succeeds in including all the irreps in the List might on the group and its Kronecker (tensor) product table. - - However, for many groups, this procedure does indeed succeed in listing all the irreps. This is particularly true for groups where the tensor product of any two irreps spans the whole space of irreps. This is the case, for example, for SU(2) (the group of 2x2 unitary matrices with determinant 1). - -\subsubsection{Example: Diedral group $D_4$} - - The diedral group $D_4$ is the group of symmetries of a square. $D_4$ has five irreps, e.g. shown in Cohen \& Welling 2017 (Steerable CNNs). - - \paragraph{Irreps and their matrices $\rho(g)$ for $g \in G$} - - \begin{figure} - \centering - \includegraphics[width=\textwidth]{figs/d4.png} - \end{figure} - - \paragraph{Kronecker table} To get the Kronecker table, we compute each tensor-representation by: - \begin{itemize} - \item computing its matrices $\rho(g)$ on each group element, by definition of the tensor product of matrices - \item computing the characters $\Xi(g) = \text{Tr}(\rho(g))$ for each group element - \item computing the inner-product of the character $\Xi$ with each character of each irreps to get the multiplicity. - \end{itemize} - - -\begin{table}[] -\centering - \begin{tabular}{|l|l|l|l|l|l|} - \hline - $\otimes$ & $A_1$ & $A_2$ & $B_1$ & $B_2$ & $E$ \\ \hline - $A_1$ & $(1, 0, 0, 0, 0)$ & $(0, 1, 0, 0, 0)$ & $(0, 0, 1, 0, 0)$ & $(0, 0, 0, 1, 0)$ & $(0, 0, 0, 0, 1)$ \\ \hline - $A_2$ & $(0, 1, 0, 0, 0)$ & $(1, 0, 0, 0, 0)$ & $(0, 0, 0, 1, 0)$ & $(0, 0, 1, 0, 0)$ & $(0, 0, 0, 0, 1)$ \\ \hline - $B_1$ & $(0, 0, 1, 0, 0)$ & $(0, 0, 0, 1, 0)$ & $(1, 0, 0, 0, 0)$ & $(0, 1, 0, 0, 0)$ & $(0, 0, 0, 0, 1)$ \\ \hline - $B_2$ & $(0, 0, 0, 1, 0)$ & $(0, 0, 1, 0, 0)$ & $(0, 1, 0, 0, 0)$ & $(1, 0, 0, 0, 0)$ & $(0, 0, 0, 0, 1)$ \\ \hline - $E$ & $(0, 0, 0, 0, 1)$ & $(0, 0, 0, 0, 1)$ & $(0, 0, 0, 0, 1)$ & $(0, 0, 0, 0, 1)$ & $(1, 1, 1, 1, 0)$ \\ \hline - \end{tabular} - \caption{Kronecker table for the diedral group $D_4$. We choose $\rho_0 = A_1$, $\rho_1 = E$.} - \label{tab:my-table} -\end{table} - - -\paragraph{Procedure} We choose $\rho_0 = A_1$, $\rho_1 = E$. -\begin{itemize} - \item List = [$\rho_0$, $\rho_1$] - \item Compute irreps in the decomposition of $\rho_1 \otimes \rho_1$, that are not already in List. This gives: $A_2, B_1, B_2$. - \item Stopping criterion reached: all irreps in List. -\end{itemize} - -\paragraph{Computations after the $G$-Convolution} - -We store the representations in a variable. - -We compute every Fourier coefficient of $\Theta$, via: -\begin{equation} - \mathcal{F}(\Theta)_\rho = \sum_{g \in G} \Theta(g).\rho(g) -\end{equation} -by taking a linear combination of the $\rho(g)$ matrices for each $\rho$ irreps. Note that $\mathcal{F}(\Theta)_\rho \in \mathbb{C}$ for every $\rho$ in $\{A_1, A_2, B_1, B_2\}$ and $\mathcal{F}(\Theta)_E \in \mathbb{C}^{2 \times 2}$. - -We compute $\beta_{\rho_0, \rho_0} \in \mathbb{C}$. -\begin{equation} - \beta_{\rho_0, \rho_0} = |\mathcal{F}(\Theta)_{\rho_0}|^2 \mathcal{F}(\Theta)_{\rho_0} \in \mathbb{C} -\end{equation} - -We compute $\beta_{\rho_1, \rho_0} \in \mathbb{C}^{2 \times 2}$. -\begin{equation} - \beta_{\rho_1, \rho_0} = \mathcal{F}(\Theta)_{\rho_1}^\dagger\mathcal{F}(\Theta)_{\rho_1} \mathcal{F}(\Theta)_{\rho_0}^* \in \mathbb{C}^{2 \times 2} -\end{equation} - -We compute $\beta_{\rho_1, \rho_1} \in \mathbb{C}^{4 \times 4}$. We use the notation: $\mathcal{F} = \mathcal{F}(\Theta)_{\rho_1}$. -\begin{align*} - \beta_{\rho_1, \rho_1} - &= (\mathcal{F}(\Theta)_{\rho_1} \otimes \mathcal{F}(\Theta)_{\rho_1})^\dagger C_{{\rho_1} {\rho_1}} - \left[ - \bigoplus_{\rho \in \rho_1 \otimes \rho_1=\{A_1, A_2, B_1, B_2\}} - \mathcal{F}(\Theta)_\rho - \right] C_{{\rho_1} {\rho_1}}^{\dagger} \\ - &= \left[\begin{array}{ll} -\mathcal{F}_{1,1}\left[\begin{array}{ll} -\mathcal{F}_{1,1} & \mathcal{F}_{1,2} \\ -\mathcal{F}_{2,1} & \mathcal{F}_{2,2} -\end{array}\right] & \mathcal{F}_{1,2}\left[\begin{array}{ll} -\mathcal{F}_{1,1} & \mathcal{F}_{1,2} \\ -\mathcal{F}_{2,1} & \mathcal{F}_{2,2} -\end{array}\right] \\ -\mathcal{F}_{2,1}\left[\begin{array}{ll} -\mathcal{F}_{1,1} & \mathcal{F}_{1,2} \\ -\mathcal{F}_{2,1} & \mathcal{F}_{2,2} -\end{array}\right] & \mathcal{F}_{2,2}\left[\begin{array}{ll} -\mathcal{F}_{1,1} & \mathcal{F}_{1,2} \\ -\mathcal{F}_{2,1} & \mathcal{F}_{2,2} -\end{array}\right] -\end{array}\right]^\dagger C_{{\rho_1} {\rho_1}} -\begin{bmatrix} - \mathcal{F}(\Theta)_{A_1} & 0 & 0 & 0\\ - 0 & \mathcal{F}(\Theta)_{A_2} & 0 & 0\\ - 0 & 0 & \mathcal{F}(\Theta)_{B_1} & 0\\ - 0 & 0 & 0 & \mathcal{F}(\Theta)_{B_2}\\ -\end{bmatrix} -C_{{\rho_1} {\rho_1}}^{\dagger} -\end{align*} - -we need the CJ coefficients for the $\rho_1 \otimes \rho_1 = E \otimes E$ decomposition. - - % The Kronecker product table is not the character table of the group, but they are related through the orthogonality relations of the character values. - - % More specifically, the tensor product of two representations can be decomposed into irreducible representations, and the multiplicity of a particular irrep in this decomposition can be determined using the character values from the character table. - - - -\end{proof} - - - -\section{\color{deepblue}{Domain $\Omega = (G,~+)$ (compact groups)}} - -\subsection{Fourier Transform: Definition} - -Fourier analysis can be generalized to other compact groups, such as 2D and 3D rotation, by preserving this defining property of equivariance to the group action \cite{rudin1962fourier}. - -\textbf{The (continuous) Fourier transform} (for commutative or non-commutative groups) is: -\begin{equation} - \mathcal{F}(f)_\rho = \hat{f}_\rho = \int_G f(g)\rho(g) dg, -\end{equation} - -defined for any $\rho$ being an irreducible representations, where $G$ denotes a compact group, and the integral uses the Haar measure $dg$ on $G$. Note that the definition of the Fourier transform is the same for non-commutative or commutative groups, the only requirement is for these groups to be compact. - -\subsection{Fourier Transform: Equivariance} - -Define the transformation of $f$ by $\tilde g$ as $(\tilde{g} \ast f)(g) = f({\tilde g}^{-1}\circ g)$. The Fourier transform undergoes a transformation by the same $\tilde g$, as follows, which shows its equivariance. - -\vspace{-0.7cm} -\begin{align*} - \mathcal{F}(\tilde{g} \ast f)_\rho - &= \int_{g \in G} (\tilde{g} \ast f)(g)\rho(g) dg \\ - &= \int_{g \in G} f({\tilde g}^{-1}\circ g)\rho(g) dg \\ - &= \int_{g' \in G} f(g')\rho(\tilde{g}\circ g') dg' \\ - &= \int_{g' \in G} f(g')\rho(\tilde{g}).\rho(g') dg' \\ - &= \rho(\tilde{g}) . \int_{g' \in G} f(g')\rho(g') dg' \\ - &= \rho(\tilde{g}) .\mathcal{F}(f)_\rho -\end{align*} -\vspace{-0.7cm} - -\subsection{Triple Correlation: Definition} - -The triple correlation of a function $f$ defined on a compact group $G$ is: -$$ -T(f)_{g_1, g_2}=\int_{g \in G} f^*(g) f\left(g g_1\right) f\left(g g_2\right)dg . -$$ - -\subsection{Triple Correlation: Invariance} -Note that $T(f)$ is a function defined on $G \times G$, and that, like the autocorrelation, the triple correlation is invariant under left translation: $T(f_1)=T(f_2)$ if $f_1(g)=f_2(h g)$. - -\begin{proof} -Consider two real signals $f_1, f_2$ defined on a domain $\Omega$ equipped with the action of a group $G$, such that $f_2 = T_h[f_1]$ in the sense defined in the previous section. - -We show that this implies that $T(f_1)_{g_1, g_2} = T(f_2)_{g_1, g_2}$. Taking $g_1, g_2 \in G$, we have: -\begin{align*} - T(f_2)_{g_1, g_2} - &= \int_{g \in G} - f_2^*(g) f_2\left(gg_1\right) f_2\left(gg_2\right) dg \\ - &= \int_{g \in G} - T_h[f_1]^*(g) T_h[f_1]\left(gg_1\right) T_h[f_1]\left(gg_2\right) dg \\ - &= \int_{g \in G} - f_1^*(hg) f_1\left(hgg_1\right) f_1\left(hgg_2\right) dg \\ - &= \int_{g \in G} - f_1^*(g) f_1\left(gg_1\right) f_1\left(gg_2\right) dg \\ - &= T(f_1)_{g_1, g_2}. -\end{align*} -where we use the change of variable $hg \rightarrow g$. This proves the invariance of the TC with respect to group actions on the signals. -\end{proof} - -\subsection{Triple Correlation: Symmetries} - -\begin{proposition}[Symmetries] -The triple correlation of a signal has the following symmetry: -\begin{align*} - (s1) \qquad T(f)_{g_1, g_2} &= T(f)_{g_2, g_1} -\end{align*} -If $G$ is commutative, and $f$ takes on real values, the triple correlation has the following additional symmetries: -\begin{align*} - (s2) \qquad T(f)_{g_1, g_2} - = T(f)_{g^{-1}_1, g_2g^{-1}_1} - = T(f)_{g_2g^{-1}_1, g^{-1}_1} - = T(f)_{g_1g^{-1}_2, g^{-1}_2} - = T(f)_{g^{-1}_2, g_1g^{-1}_2} -\end{align*} -\end{proposition} - - -\begin{proof} - We prove symmetry (s1), which relies on the fact that $f(gg_2)$ and $f(gg_1)$ are scalar values that commute: - \begin{align*} - T(f)_{g_2, g_1} - = \int_{g \in G} f^*(g)f(gg_2)f(gg_1) dg - = \int_{g \in G} f^*(g)f(gg_1)f(gg_2) dg - = T(f)_{g_2, g_1}. - \end{align*} - We assume that the signal is real and that $G$ is commutative. - We prove the first equality of symmetry (s2): - \begin{align*} - T(f)_{g^{-1}_1, g_2g^{-1}_1} - &= \int_{g \in G} f^*(g)f(gg^{-1}_1)f(gg_2g^{-1}_1) dg\\ - &= \int_{g' \in G} f^*(g'g_1)f(g')f(g'g_1g_2g^{-1}_1) dg - \quad \text{(with $g' = g - g_1$, i.e. $g = g'g_1$)} \\ - &= \int_{g' \in G} f^*(g'g_1)f(g')f(g'g_2) dg - \quad \text{(because $G$ commutative: $g_2 g^{-1}_1 = g^{-1}_1 g_2$)} \\ - &= \int_{g \in G} f(gg_1)f(g)f(gg_2) dg - \quad \text{($f$ is a real signal, which equals its conjugate)}\\ - &= \int_{g \in G} f(g)f(gg_1)f(gg_2) dg - \quad \text{($f$ is takes on real values that commute)}\\ - &= \int_{g \in G} f(g)^*f(gg_1)f(gg_2) dg\\ - &= T(f)_{g_2, g_1} - \end{align*} - The second equality of symmetry (s2) follows using (s1). - The third and fourth equality of symmetry (s2) have the same proof. -\end{proof} - -\subsection{Bispectrum: Definition} - -The bispectrum can be defined more generally for signals defined over a space that is homogeneous for a compact group \cite{kakarala2012bispectrum}. - -\textbf{The bispectrum for commutative groups} is defined over a pair of irreducible representations $\rho_1, \rho_2$: - -\begin{equation} - \beta (f)_{\rho_1, \rho_2} = \hat{f}_{\rho_1}\hat{f}_{\rho_2}\hat{f}_{\rho_1 \rho_2}^{\dagger} \qquad \in \mathbb{C} - \label{eqn:group-bs} -\end{equation} -The irreducible representations (irreps) of commutative groups map to scalar values. - -\textbf{The bispectrum for non-commutative groups} is defined over a pair of irreducible representations $\rho_1, \rho_2$: - -\begin{align*} - \beta (f)_{\rho_1, \rho_2} - &= [\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}] C_{\rho_1,\rho_2} \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big] C^{\dagger}_{\rho_1,\rho_2}\\ - &= [\hat{f}{\rho_1} \otimes \hat{f}{\rho_2}] C_{\rho_1,\rho_2} \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \hat{f}_{\rho}^{\dagger} \Big] C^{\dagger}_{\rho_1,\rho_2} \qquad \in \mathbb{C}^{D_1 D_2 \times D_1 D_2} - \label{eqn:non-commutative-bs} -\end{align*} - -The irreps of \textit{non-commutative} groups map to matrices. In this definition, $C$ is a Clebsch-Gordan matrix, $\otimes$ is the tensor product, and $\oplus$ is a direct sum over irreps. The unitary Clebsch-Gordan matrix $C$ is analytically defined for each pair of representations as: - -\begin{equation} - (\rho_1 \otimes \rho_2)(g) = C_{\rho_1,\rho_2}^\dagger \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(g) \Big] C_{\rho_1,\rho_2}. - \label{eqn:non-commutative-bs} -\end{equation} - -\begin{proof} -We prove this by applying the Fourier transform to the triple correlation formula, generalizing the proof of Karakala to compact groups. - -The Fourier transformation of $T(f)$ requires tensor products of the representation matrices, since it is defined on the product group. - -We denote $F = \mathcal{F}(f)$ for simplicity of notations. - -The bispectrum is obtained by the formula: -$$ -\beta(f)_{\rho_1, \rho_2} -= \int_{g_1\in G} \int_{g_2\in G} - T(f)_{g_1, g_2} - \left[ - \rho_1\left(g_1\right)^{\dagger} \otimes \rho_2\left(g_2\right)^{\dagger} - \right]dg_1dg_2 -$$ -for all ${\rho_1}, {\rho_2}$. Inserting the definition of the triple correlation, and simplifying with a change of variable $g_1 = gg_1$, $g_2 = gg_2$: -\begin{align*} -\beta(f)_{\rho_1, \rho_2} -=& -\int_{g_1\in G} \int_{g_2\in G} - \int_{g \in G} f^*(g) f\left(g g_1\right) f\left(g g_2\right) - \left[ - \rho_1\left(g_1\right)^{\dagger} \otimes \rho_2\left(g_2\right)^{\dagger} - \right] - dg dg_1dg_2 \\ -=& \int_{g \in G} - f^*(g) - \int_{g_1\in G} \int_{g_2\in G} - f\left(g g_1\right) f\left(g g_2\right) - \left[ - \rho_1\left(g_1\right)^{\dagger} \otimes \rho_2\left(g_2\right)^{\dagger} - \right] - dg_1dg_2 - dg \\ -=& \int_{g \in G} - f^*(g) - \int_{g_1\in G} \int_{g_2\in G} - f\left(g_1\right) f\left(g_2\right) - \left[ - \rho_1\left(g^{-1}g_1\right)^{\dagger} \otimes \rho_2\left(g^{-1}g_2\right)^{\dagger} - \right] - dg_1dg_2 - dg \\ -=& \int_{g \in G} - f^*(g) - \int_{g_1\in G} \int_{g_2\in G} - f\left(g_1\right) f\left(g_2\right) - \left[ - \rho_1(g_1)^{\dagger}\rho_1(g^{-1})^{\dagger} \otimes \rho_2(g_2)^{\dagger}\rho_2(g^{-1})^\dagger - \right] - dg_1dg_2 - dg \\ -=& \int_{g \in G} - f^*(g) - \int_{g_1\in G} \int_{g_2\in G} - f\left(g_1\right) f\left(g_2\right) - \left[ - \rho_1(g_1)^{\dagger}\rho_1(g) \otimes \rho_2(g_2)^{\dagger}\rho_2(g) - \right] - dg_1dg_2 - dg \\ -=& \int_{g \in G} - f^*(g) - \int_{g_1\in G} \int_{g_2\in G} - f\left(g_1\right) f\left(g_2\right) - \left[\rho_1(g_1)^{\dagger}\otimes \rho_2(g_2)^{\dagger}\right] . \left[\rho_1(g) \otimes \rho_2(g)\right] - dg_1dg_2 - dg \\ -&= \int_{g \in G} - f^*(g) - [\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}]\left[\rho_1(g) \otimes \rho_2(g)\right] - dg\\ -&= -\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} - \left[ - \int_{g \in G} f(g)^* \rho_1(g) \otimes \rho_2(g) dg - \right].\\ -&= -\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} - \left[ - \int_{g \in G} f(g)^* \left( C_{\rho_1 \rho_2} \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(g) C_{\rho_1 \rho_2}^{\dagger}\right) dg - \right].\\ -& = -\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2} C_{\rho_1 \rho_2} \left[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho} \right] C_{\rho_1 \rho_2}^{\dagger} -\end{align*} - -where the last two lines uses the Clebsh-Gordan formula to reduce the tensor product of representations. - - -The formula simplifies to (1) if $G$ is Abelian, in which case the fundamental theorem of finite Abelian groups shows that $G$ is a direct product of cyclic groups, each of which is represented by the complex exponentials $x \mapsto e^{j \omega x}$. - -\end{proof} - - -\subsection{Bispectrum: Invariance} - -Define the transformation of $f$ by $\tilde g$ as $(\tilde{g} \ast f)(x) = f({\tilde g}^{-1}\circ g)$. Under this group action, the bispectrum becomes: -\begin{align*} - \beta(\tilde{g} \ast f)_{\rho_1, \rho_2} - &= \Big[\mathcal{F}(\tilde{g} \ast f)_{\rho_1} \otimes \mathcal{F}(\tilde{g} \ast f)_{\rho_2})\Big] .C_{\rho_1,\rho_2} \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(\tilde{g} \ast f)_{\rho}^{\dagger} \Big]. C^{\dagger}_{\rho_1,\rho_2} - \quad \text{(bispectrum definition)}\\ - &= \Big[(\rho_1(\tilde{g}).\mathcal{F}(f)_{\rho_1}) \otimes (\rho_2(\tilde{g}). \mathcal{F}(f)_{\rho_2})\Big] .C_{\rho_1,\rho_2} \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(\tilde{g})^\dagger .\mathcal{F}(f)_{\rho}^{\dagger} \Big] .C^{\dagger}_{\rho_1,\rho_2} - \quad \text{(equivariance of $\mathcal{F}$)}\\ - &= - \Big[\rho_1(\tilde{g}) \otimes \rho_2(\tilde{g})\Big] . - \Big[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})\Big] . - C_{\rho_1,\rho_2} - \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(\tilde{g})^\dagger .\mathcal{F}(f)_{\rho}^{\dagger} \Big] .C^{\dagger}_{\rho_1,\rho_2} - \quad \text{(*)}\\ - &= - \Big[\rho_1(\tilde{g}) \otimes \rho_2(\tilde{g})\Big] . - \Big[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})\Big] . - C_{\rho_1,\rho_2} . - \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(\tilde{g})^\dagger) \Big].\Big[\bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big]. C^{\dagger}_{\rho_1,\rho_2} - \quad \text{($\oplus$ definition)}\\ - &= - \Big[\rho_1(\tilde{g}) \otimes \rho_2(\tilde{g})\Big] . - \Big[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})\Big] . - C_{\rho_1,\rho_2}. \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(\tilde{g})^\dagger) \Big] .C^{\dagger}_{\rho_1,\rho_2}.C_{\rho_1,\rho_2}.\Big[\bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big] .C^{\dagger}_{\rho_1,\rho_2} - \quad \text{(unitary)}\\ - &= - \Big[\rho_1(\tilde{g}) \otimes \rho_2(\tilde{g})\Big] - . - \Big[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})\Big] . - \Big[ C_{\rho_1,\rho_2}. \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \rho(\tilde{g})^\dagger) .C^{\dagger}_{\rho_1,\rho_2}\Big]. - C_{\rho_1,\rho_2}.\Big[\bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big] .C^{\dagger}_{\rho_1,\rho_2}\\ - &= - \Big[\rho_1(\tilde{g}) \otimes \rho_2(\tilde{g})\Big] .\Big[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2})\Big] .\Big[\rho_1(\tilde{g}) \otimes \rho_2(\tilde{g})\Big]^\dagger. C_{\rho_1,\rho_2}.\Big[\bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big] .C^{\dagger}_{\rho_1,\rho_2}\\ - &= - \Big[(\rho_1(\tilde{g}).\rho_1(\tilde{g})^\dagger.\mathcal{F}(f)_{\rho_1}) \otimes (\rho_2(\tilde{g}).\rho_2(\tilde{g})^\dagger. \mathcal{F}(f)_{\rho_2})\Big]. C_{\rho_1,\rho_2}.\Big[\bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big]. C^{\dagger}_{\rho_1,\rho_2}\\ - &= - \Big[\mathcal{F}(f)_{\rho_1} \otimes\mathcal{F}(f)_{\rho_2}\Big] . C_{\rho_1,\rho_2}.\Big[\bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big]. C^{\dagger}_{\rho_1,\rho_2}\qquad \text{(unitary representations)}\\ - &= - \beta(f)_{\rho_1, \rho_2} \qquad \text{(bispectrum definition)} -\end{align*} -where we use the linear algebra identity $(*)$: $(A.B) \otimes (C.D) = (A\otimes C) . (B \otimes D)$ for $\otimes$ the tensor product and $.$ the matrix multiplication. - -\section{\color{purple}{Domain $\Omega = (S^2,~SO(3),~\ast)$ (spherical rotations)}} - -We move towards homogeneous space for a group, and first consider an example before writing the general theory. This example is the spherical harmonic transform, which is a generalization of the Fourier transform to the non-commutative group of spherical rotations $SO(3)$ acting on the 2-sphere. - -\subsection{Fourier Transform: Definition} -Functions defined over a sphere $S^2$ can be expanded on the spherical harmonics as: -\begin{equation} - f(\theta, \phi)=\sum_{l=0}^{\infty} \sum_{m=-l}^l \widehat{f}_{l, m} Y_l^m(\theta, \phi) -\end{equation} -where $Y_l^m(\theta, \phi)$ as the spherical harmonics of coefficients $l, m$ given by $Y_l^m(\theta, \phi)=k_{lm} P_l^m(\cos \theta) e^{i m \phi}$ -where $l=0,1,2, \ldots ; \quad m=[-l, l]$, $P_l^m$ are the associated Legendre polynomials, and $k_{lm}-\sqrt{\frac{2 l+1}{4 \pi} \frac{(l-m) !}{(l+m) !}}$ the normalization constant. - -We recall that the spherical harmonics are the eigenfunctions of the Laplace operator on $S_2$ (with eigenvalue $-l^2$ ), and they form an orthonormal basis for $L_2\left(S_2\right)$. - -\textbf{The spherical harmonics transform} of a spherical function $f$ is given by: -\begin{align*} - \widehat{f}_{l, m} - &= \qquad \in \mathbb{C} \\ - &= \int_0^\pi \int_0^{2 \pi} f^\dagger(\theta, \phi) Y_l^m(\theta, \phi) \cos \theta d \phi d \theta \\ - &= \int_0^\pi \int_0^{2 \pi} f^\dagger(\theta, \phi) k_{lm} P_l^m(\cos \theta) e^{i m \phi} \cos \theta d \phi d \theta \\ - &= k_{lm} \int_0^\pi \Big[ \int_0^{2 \pi} f^\dagger(\theta, \phi)e^{i m \phi}d \phi\Big] P_l^m(\cos \theta)\cos \theta d \theta -\end{align*} -where the last line shows that the spherical harmonic transform can be reduced to a regular Fourier transform in the longitudinal coordinate $\phi$ followed by a projection onto the associated Legendre functions. We note that there exists an expression for the discrete Fourier transform associated to that case. - - -We bring this expression into an equation amenable to a definition of generalized Fourier transform, i.e. only keeping the index $l$ that indexes the irreducible representations of $SO(3)$. Thus, we get vector-valued Fourier coefficients. - -\textbf{The (vector) Fourier transform} of a spherical function $f$, where the subscript $0$ will become clear at the end of this computation, is: -\begin{align*} - \mathcal{F}_0(f)_l = \widehat{f}_{l} - &= \\ - &= \int_0^\pi \int_0^{2 \pi} f^\dagger(\theta, \phi) Y_l(\theta, \phi) \cos \theta d \phi d \theta \qquad \in \mathbb{C}^{2l+1} \\ - &= \sqrt{\frac{2l+1}{4\pi}}\int_0^\pi \int_0^{2 \pi} f^\dagger(\theta, \phi). [\rho_l(\phi, \theta, \gamma)]_0 \cos \theta d \phi d \theta - \qquad \text{(relation between $Y$'s and Wigner matrices, Karakala)}\\ - &= \frac{1}{\pi}\sqrt{\frac{2l+1}{4\pi}}\int_0^\pi\int_0^\pi \int_0^{2 \pi} f^\dagger(\theta, \phi). [\rho_l(\phi, \theta, \gamma)]_0 \cos \theta d \phi d \theta d\gamma \\ - &= \kappa_l \int_{R \in SO(3)} f^\dagger(T_R(x_0)). [\rho_l(R)]_0 dR \qquad \text{(Haar measure in Euler angles)} -\end{align*} -where $[\rho_l(R)^*]_0$ is the first column of the Wigner matrix, and $R$ is a rotation bringing the north pole $x_0$ into $(\theta, \phi)$, i.e. the rotation of Euler angles $(\alpha, \beta, \gamma)$ where $\alpha=\phi$ and $\beta=\theta$, i.e. convention of Euler angles, where $\alpha$ is a longitudinal angle and -$\beta$ is a colatitudinal angle (spherical polar angles in the physical definition of such angles). We use $\kappa_l$ to denote a normalization constant. - -We note that this is \textbf{not equal} to the Fourier transform defined on an homogeneous space, as only one column is extracted: we have a vector-valued Fourier transform, instead of a matrix-valued Fourier transform, which is more computationally effective. This raises the question on whether every Fourier transform on homogeneous spaces can be reduced into a vector-valued transform in a more general way. - -\textbf{The Fourier transform} of a spherical function $f$ is indeed: -\begin{align*} - \mathcal{F}(f)_l - = \int_{R \in SO(3)} f^\dagger(T_R(x_0)). \rho_l(R) dR. -\end{align*} - -\subsection{Fourier Transform: Equivariance} - - -Define the transformation of $f$ by $\tilde R$ as $(\tilde{R} \ast f)(\theta, \phi) = f(\tilde R (\theta, \phi)) = f(T_{\tilde R}^{-1}.u)$. The (vector) Fourier transform undergoes a transformation by the same $\tilde R$, as follows, which shows its equivariance. - -\begin{align*} - \mathcal{F}(\tilde{R} \ast f)_{l} - &=\kappa_l \int_{R \in SO(3)} (\tilde{R} \ast f)^\dagger(T_R(x_0)). [\rho_l(R)]_0 dR\\ - &=\kappa_l \int_{R \in SO(3)} - f^\dagger(T_{\tilde R}^{-1} \circ T_R(x_0)). [\rho_l(R)]_0 dR \\ - &=\kappa_l \int_{R \in SO(3)} - f^\dagger(T_{\tilde R^{-1} R}(x_0)). [\rho_l(R)]_0 dR \\ - &=\kappa_l \int_{R' \in SO(3)} - f^\dagger(T_{R'}(x_0)). [\rho_l(\tilde{R}R')]_0 \tilde{R}^{-1}dR' \\ - &=\kappa_l \int_{R' \in SO(3)} - f^\dagger(T_{R'}(x_0)). [\rho_l(\tilde{R}).\rho_l(R')]_0 \tilde{R}^{-1}dR' - \qquad \text{($\rho_l$ is representation)}\\ - &=\kappa_l \rho_l(\tilde{R}). - \int_{R' \in SO(3)} - f^\dagger(T_{R'}(x_0)).[\rho_l(R')]_0 \tilde{R}^{-1} dR' - \qquad \text{(vector interpretation of matrix multiplication (*))}\\ - &=\kappa_l \rho_l(\tilde{R}). - \int_{R' \in SO(3)} - f^\dagger(T_{R'}(x_0)).[\rho_l(R')]_0 dR' - \qquad \text{($\tilde{R}^{-1}$ isometry)} \\ - &= \rho_l(\tilde{R}) . \mathcal{F}(f)_{l} -\end{align*} - -We note that line $(*)$ also proves the equivariance property of the spherical harmonics. - -The equivariance of the matrix Fourier transform is proved similarly, and we prove it in the general case of homogeneous spaces in the next section. - -\subsection{Bispectrum: Definitions} - -The two definitions of Fourier transform (vector-valued and matrix-valued) give rise to two definitions of bispectrum. We focus on the vector-valued case, as the matrix-valued case is tackled in all generality in the next section. - -\textbf{The (vector) bispectrum} of a spherical function $f$ is a vector $\beta(f)_{l_1l_2}$ formed of the following scalar entries: -\begin{equation} - \beta(f)_{l_1l_2}[l]:=\left[\mathcal{F}_0(f)_{l_1} \otimes \mathcal{F}_0(f)_{l_2} \right] C_{l_1l_2} \hat{\mathcal{F}_0(f)_l}^{\dagger} \qquad \in \mathbb{C}; \quad|l_1-l_2| \leq l \leq l_1+l_2. -\end{equation} -where $C_{l_1l_2}$ is the Clebsch-Gordan matrix associated with $\rho_{l_1} \otimes \rho_{l_2}$, and $\hat{\mathcal{F}}_0(f)_l$ is the $(2l_1+1)(2l_2+1)$ vector padded with zeros: $\hat{\mathcal{F}}_0(f)_l:=\left[0, \ldots, 0, \mathcal{F}_0(f)_l, 0, \ldots, 0\right]$, where the number of zeros preceding $\mathcal{F}_0(f)_l$ is $n_p$, and the number succeeding $\mathcal{F}_0(f)_l$ is $n_s$, where $n_p:=\sum_{q=|\ell_1-\ell_2|}^{l-1}(2 q+1)$ and $n_s:=\sum_{q=l+1}^{\ell_1+\ell_2}(2 q+1)$. - -Likewise, $\mathcal{F}_0(f)_{l_1} \otimes \mathcal{F}_0(f)_{l_2}$ is a $(2l_1+1)(2l_2+1)$ vector, such that the resulting $\beta(f)_{l_1l_2}[l]$ is indeed a scalar. - -\textbf{The (matrix) bispectrum} of a spherical function $f$ is: -\begin{equation} - \beta(f)_{l_1l_2} = [\mathcal{F}(f)_{l_1} \otimes \mathcal{F}(f)_{l_2}] C_{l_1,l_2} \Big[ \bigoplus_{l \in l_1 \otimes l_2} \mathcal{F}(f)_{l}^{\dagger} \Big] C^{\dagger}_{l_1,l_2} \qquad \in \mathbb{C}^{(2l_1+1)(2l_2 + 1) \times (2l_1+1)(2l_2 +1)} -\end{equation} - -% \textbf{The bispectrum for spherical functions} is built from the $(2 l_1+1)(2l_2+1)$-dimensional tensor product vectors $\widehat{\boldsymbol{f}}_{l_1} \otimes \widehat{\boldsymbol{f}}_{l_2}$, which transform according to -% $$ -% \widehat{\boldsymbol{f}}_{l_1} \otimes \widehat{\boldsymbol{f}}_{l_2} \mapsto\left(D^{\left(l_1\right)}(R) \otimes D^{\left(l_2\right)}(R)\right) \cdot\left(\widehat{\boldsymbol{f}}_{l_1} \otimes \widehat{\boldsymbol{f}}_{l_2}\right) . -% $$ - -% \textbf{The non-zero elements of the bispectrum} for spherical functions are (something like): - -% \begin{aligned} -% p_{l_1, l_2} -% &=\widehat{f}_{l_1} \otimes \widehat{f}_{l_2} \bigoplus_{l \in l_1 \otimes l_2}\widehat{g}_{l_1, l_2, l}^{\dagger} \cdot \widehat{f}_l \qquad \in \mathbb{C}^{D_1 D_2}\\ -% & = \bigoplus_{l \in l_1 \otimes l_2} \sum_{m=-l}^l \sum_{m_1=-l_1}^{l_1} C_{m_1, m-m_1, m}^{l_1, l_2, l} \widehat{f}_{l_1, m_1}^* \widehat{f}_{l_2, m-m_1}^* \widehat{f}_{l_{l, m}} . -% \end{aligned} - - -% Up to unitary transformation, these invariants are equivalent to the non-vanishing matrix elements of the abstract bispectrum (as already derived in [3] and [1]). Any kernel built from the bispectrum using (प3) as features will be invariant to translation and rotation. - -\subsection{Bispectrum: Invariances} - -The two definitions of bispectrum are invariant. We focus on the vector-valued case, as the matrix-valued case is tackled in all generality in the next section. For the vector-valued case, we prove that each of the scalar entries forming the bispectrum vector is equivariant. - -Define the transformation of $f$ by $\tilde R$ as $(\tilde{R} \ast f)(x) = f({\tilde R}^{-1}\circ x)$. Under this group action, the coefficient $l$ of the vector bispectrum becomes: -\begin{align*} - \beta(\tilde{R} \ast f)_{l_1l_2}[l] - &=\left[ - \mathcal{F}(\tilde{R} \ast f)_{l_1} \otimes \mathcal{F}(\tilde{R} \ast f)_{l_2} - \right] - C_{l_1l_2} \mathcal{F}_0(\tilde{R} \ast f)_l^{\dagger} \\ - &=\left[ - (\mathcal{F}(f)_{l_1}.\rho_{l_1}(\tilde{R})) \otimes (\mathcal{F}(f)_{l_2}.\rho_{l_2}(\tilde{R})) - \right] - C_{l_1l_2} .\mathcal{F}_0(\tilde{R} \ast f)_l^{\dagger} - \qquad \text{(equivariance on the right with row-vectors)} \\ - &=\left[ - \mathcal{F}(f)_{l_1} \otimes (\mathcal{F}(f)_{l_2}) - \right] . - \left[ - \rho_{l_1}(\tilde{R}) \otimes \rho_{l_2}(\tilde{R}) - \right] . - C_{l_1l_2} . - \mathcal{F}_0(\tilde{R} \ast f)_l^{\dagger} - \\ - &=\left[ - \mathcal{F}(f)_{l_1} \otimes (\mathcal{F}(f)_{l_2}) - \right] . - \left[ - \rho_{l_1}(\tilde{R}) \otimes \rho_{l_2}(\tilde{R}) - \right] . - C_{l_1l_2} . - \left[ \mathcal{F}_0(f)_l.\bigoplus_{i=|l_1 - l_2|}^{l_1+l_2} \rho_i(\tilde R)\right]^\dagger - \qquad \text{(only $i=l$ is non-zero?)} - \\ - &=\left[ - \mathcal{F}(f)_{l_1} \otimes (\mathcal{F}(f)_{l_2}) - \right] . - \left[ - \rho_{l_1}(\tilde{R}) \otimes \rho_{l_2}(\tilde{R}) - \right] . - C_{l_1l_2} . - \left[ \bigoplus_{i=|l_1 - l_2|}^{l_1+l_2} \rho_i(\tilde R)\right]^\dagger - . \mathcal{F}_0(f)_l^\dagger - \\ - &=\left[ - \mathcal{F}(f)_{l_1} \otimes (\mathcal{F}(f)_{l_2}) - \right] . - \left[ - \rho_{l_1}(\tilde{R}) \otimes \rho_{l_2}(\tilde{R}) - \right] . - C_{l_1l_2} . - \left[ \bigoplus_{i=|l_1 - l_2|}^{l_1+l_2} \rho_i(\tilde R)\right]^\dagger - .C_{l_1l_2}^\dagger - . C_{l_1l_2} \mathcal{F}_0(f)_l^\dagger - \qquad \text{(unitary $C_{l_1l_2}$)}\\ - &=\left[ - \mathcal{F}(f)_{l_1} \otimes (\mathcal{F}(f)_{l_2}) - \right] - . C_{l_1l_2} \mathcal{F}_0(f)_l^\dagger - \qquad \text{(Clebsh-Gordan)}\\ - &= \beta(f)_{l_1l_2}[l] -\end{align*} - -\section{\color{purple}{Domain $\Omega = (H,~G,~\ast)$ (homogeneous space)}} - -By definition, $H$ is a homogeneous space of $G$ if fixing any $x_0 \in H$, the set $T_g(x_0)$ ranges over the whole of $H$ as $g$ ranges over $G$. - -The classical example of a homogeneous space is the unit sphere $S_2$ which was the focus of the previous section. The sphere is a homogeneous space of the three-dimensional rotation group $S O(3)$ : taking the North pole as $x_0$, a suitable rotation can move it to any point $x \in S_2$. - - - -\subsection{Fourier Transform: Definition} - -\textbf{The Fourier transform} for functions defined over an homogeneous space $H$ of a group $G$ is: -\begin{equation} -\mathcal{F}(f)_\rho = \widehat{f}(\rho) = \int_{g \in G} f\left(T_g(x_0)\right) \rho(g)dg. -\end{equation} - -Kondor comments on this equation as follows. Note that except for the trivial case $H=G$, Fourier transforms on homogeneous spaces are naturally redundant: typically $H$ is a much smaller space than $G$, yet a Fourier transform on $H$ has the same number of components as a Fourier transform on the entire group, i.e., as many as the number of irreducible representations of the group. One manifestation of this fact is that we might find that some Fourier components are rank deficient no matter what $f: H \rightarrow \mathbb{C}$ we choose. - -Kondor continues. While this destroys Kakarala's uniqueness result, in practice we often find that the bispectrum still furnishes a remarkably rich invariant representation of $f$. We remark that that invariance to right-translation $f^{(z)}(x)=f\left(x z^{-1}\right)$ would be a different matter: there is a variant of the bispectrum which retains the uniqueness property in this case. - -Consider the function $\tilde{f}$ defined on the group $G$, such that: $\tilde{f}(g) = f(\pi(g)) = f(T_g.x_0)$, i.e. when $\pi$ is the projection to the quotient space, defined as: -\begin{align*} - \pi : G \rightarrow H \, \qquad g \rightarrow \pi(g) = T_g.x_0. -\end{align*} - -The Fourier transform, for function over groups, gives: -\begin{equation} -\mathcal{F}(\tilde{f})_\rho -= -\widehat{\tilde{f}}(\rho) -= -\int_{g \in G} \tilde{f}(g) \rho(g)dg -= -\int_{g \in G} f(\pi(g)) \rho(g)dg -= -\int_{g \in G} f(T_g.x_0) \rho(g)dg , -\end{equation} -which is the definition we use for homogeneous space. - -Thus, the Fourier transform of a function $f$ defined on a $H$ is the same as the (group) Fourier transform for a lifted function $\tilde f$ defined on the corresponding group. - -\subsection{Fourier Transform: Equivariance} - -Define the transformation of $f$ by $\tilde g$ as $(\tilde{g} \ast f)(x) = f(T_{\tilde g}^{-1}.x)$. The Fourier transform undergoes a transformation by the same $\tilde g$, as follows, which shows its equivariance. - -\vspace{-0.7cm} -\begin{align*} - \mathcal{F}(\tilde{g} \ast f)_\rho - &= \int_{g \in G} (\tilde{g} \ast f)(T_g(x_0))\rho(g) dg \\ - &= \int_{g \in G} f(T_{\tilde g}^{-1}.T_g(x_0))\rho(g) dg \\ - &= \int_{g \in G} f(T_{\tilde g^{-1}\circ g}(x_0))\rho(g) dg \\ - &= \int_{g' \in G} f(T_{g'}(x_0))\rho(\tilde{g}\circ g') dg' \\ - &= \int_{g' \in G} f(T_{g'}(x_0))\rho(\tilde{g}).\rho(g') dg' \\ - &= \rho(\tilde{g}) . \int_{g' \in G} f(T_{g'}(x_0))\rho(g') dg' \\ - &= \rho(\tilde{g}) .\mathcal{F}(f)_\rho -\end{align*} -\vspace{-0.7cm} - -Importantly, this equivariance is the same equivariance as the one that emerged for the Fourier transform of function defined over a group. - -\subsection{Triple Correlation: Definition} - -The triple correlation of a function $f$ defined on $H$ homogeneous for a compact group $G$ is: -\begin{equation} - T(f)_{g_1, g_2} - = - \int_{g \in G} - f^*(T_g(x_0)) - f\left(T_{g g_1}(x_0)\right) f\left(T_{g g_2}(x_0)\right) - dg . -\end{equation} -We can rewrite this definition in terms of the function $\tilde f$ that is the lift of function $f$ on the group $G$: $\tilde{f}(g) = f(T_g.x_0) = f(\pi(g))$. -\begin{equation} - T(f)_{g_1, g_2} - = - \int_{g \in G} - \tilde{f}^*(g) - \tilde{f}(gg_1) \tilde{f}(gg_2) - dg , -\end{equation} -where we recognize the definition of triple correlation on groups applied to function $\tilde{f}$. - -\subsection{Triple Correlation: Invariance} -Note that $T(f)$ is a function defined on $H \times H$, and that, like the autocorrelation, the triple correlation is invariant under left translation: $T(f_1)=T(f_2)$ if $f_1(g)=f_2(h g)$. - -\begin{proof} -Consider two real signals $f_1, f_2$ defined on a domain $\domain$ equipped with the action of a group $G$, such that $f_2 = T_h[f_1]$ in the sense defined in the previous section. - -We show that this implies that $T_h[f_1] = T_h[f_2] $. Taking $g_1, g_2 \in G$, we have: -\begin{align*} - T(f_2)_{g_1, g_2} - &= \int_{g \in G} - f_2^*(T_g(x_0)) f_2\left(T_{g g_1}(x_0)\right) f_2\left(T_{g g_2}(x_0)\right) dg \\ - &= \int_{g \in G} - T_h[f_1]^*(T_g(x_0)) T_h[f_1]\left(T_{g g_1}(x_0)\right) T_h[f_1]\left(T_{g g_2}(x_0)\right) dg \\ - &= \int_{g \in G} - f_1^*(T_h \circ T_g(x_0)) f_1\left(T_h \circ T_{g g_1}(x_0)\right) f_1\left(T_h \circ T_{g g_2}(x_0)\right) dg \\ - &= \int_{g \in G} - f_1^*(T_{hg}(x_0)) f_1\left(T_{hg g_1}(x_0)\right) f_1\left(T_{hg g_2}(x_0)\right) dg \\ - &= \int_{g \in G} - f_1^*(T_{g}(x_0)) f_1\left(T_{g g_1}(x_0)\right) f_1\left(T_{g g_2}(x_0)\right) dg \\ - &= T(f_1)_{g_1, g_2} -\end{align*} -where we use the change of variable $hg \rightarrow g$. -\end{proof} - -\subsection{Bispectrum: Definitions} - -The bispectrum can be defined more generally for signals defined over a space that is homogeneous for a compact group \cite{kakarala2012bispectrum}. - -\textbf{The bispectrum for homogeneous spaces of commutative groups} is defined over a pair of irreducible representations $\rho_1, \rho_2$: - -\begin{equation} - \beta (f)_{\rho_1, \rho_2} = \hat{f}_{\rho_1}\hat{f}_{\rho_2}\hat{f}_{\rho_1 \rho_2}^{\dagger}. - \label{eqn:group-bs} -\end{equation} -The irreducible representations (irreps) of commutative groups map to scalar values. - -\textbf{The bispectrum for homogeneous spaces of non-commutative groups} is defined over a pair of irreducible representations $\rho_1, \rho_2$: - -\begin{align*} - \beta (f)_{\rho_1, \rho_2} - &= [\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}] C_{\rho_1,\rho_2} \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \mathcal{F}(f)_{\rho}^{\dagger} \Big] C^{\dagger}_{\rho_1,\rho_2}\\ - &= [\hat{f}{\rho_1} \otimes \hat{f}{\rho_2}] C_{\rho_1,\rho_2} \Big[ \bigoplus_{\rho \in \rho_1 \otimes \rho_2} \hat{f}_{\rho}^{\dagger} \Big] C^{\dagger}_{\rho_1,\rho_2} - \label{eqn:non-commutative-bs} -\end{align*} - -We note that the bispectrum of functions defined over an homogeneous space $H$ has a definition identical to the case of functions defined over a group. The only difference is that the Fourier $\mathcal{F}$ transform used is the Fourier transform for function defined over $H$, and not $G$. - -\begin{proof} -By definition, the bispectrum is the Fourier transform of the triple correlation. We compute this Fourier transform and show that we obtain the expression given above. - - -\begin{align*} - \beta (f)_{\rho_1, \rho_2} - &= - \int_{g_1 \in G} \int_{g_2 \in G} - T(f)_{g_1, g_2} - \left[ - \rho_1(g_1) \otimes \rho_2(g_2) - \right] - dg_1 dg_2 \\ - &= - \int_{g_1 \in G} \int_{g_2 \in G} - \int_{g \in G} - f^*(T_g(x_0)) - f\left(T_{g g_1}(x_0)\right) f\left(T_{g g_2}(x_0)\right) - dg - \left[ - \rho_1(g_1) \otimes \rho_2(g_2) - \right] - dg_1 dg_2 \\ -\end{align*} - - -Below, we give the main elements of the proof that shows that computing this Fourier transform indeed yields the same formula as in the case of compact groups. - -Note that the group $G$ is often ``bigger'' than the homogeneous space $H$, e.g. $SO(3)$ has dimension 3 while $S^2$ has dimension 2. Any homogeneous space $H$ can be seen as $H = G / G_0$ where $G_0$ is one stabilizer group, e.g. $S^2 = SO(3) / SO(2)$ with $G_0 = SO(2)$. - -A function $f$ defined on $H = G / G_0$ can be lifted to a function defined on $G$, as $\tilde{f}(g) = f(\pi(g))$ where $\pi$ is the canonical projection associated with the quotient space structure. The lifted function $\tilde{f}$ is invariant under translations by elements of the stabilizer $G_0$: -\begin{equation} - \tilde{f}(g_0.g) = \tilde{f}(g), \qquad \text{for all $g_0 \in G_0$}, -\end{equation} -This invariance induces a property on its fourier transform: -\begin{equation} - \mathcal{F}(\tilde{f})(\rho) = \mathcal{F}(\tilde{f})(\rho) \rho(g_0), \qquad \text{for all $g_0 \in G_0$.} -\end{equation} - -By integration over $G_0$, we get: -\begin{equation} - \mathcal{F}(\tilde{f})(\rho) = \mathcal{F}(f)(\rho).P_0(\rho)\quad \text{where: } P_0(\rho) = \int_{g_0 \in G_0} \rho(g_0), -\end{equation} -where $P_0$ is a projection operator: $P_0 . P_0 = P_0$. - -Next, one can prove that see that tensor products of projection operators decompose according to the Clebsh-Gordon formula: -$$ -\begin{gathered} -P_0(\sigma) \otimes P_0(\delta)= \\ -C_{\sigma \delta}\left[P_0\left(\omega_1\right) \oplus \cdots \oplus P_0\left(\omega_k\right)\right] C_{\sigma \delta}^{\dagger}\left[P_0(\sigma) \otimes P_0(\delta)\right] . -\end{gathered} -$$ -This ensures that the bispectrum formula on compact groups is valid for functions whose domain is a homogeneous space as well as those defined on groups. -\end{proof} - -\subsection{Bispectrum: Invariance} - -The proof of invariance of the bispectrum for function defined over (commutative and non-commutative) domains does not use the expression of the Fourier transform on groups. Rather, it only uses the fact that the Fourier transform on groups is equivariant, with equivariance factor $\rho(\tilde{g})$. Since the Fourier transform on homogeneous spaces is equivariant, with the same equivariance factor, and since the bispectra definition is the same, we get the invariance of the bispectrum with the same derivation. - -We note that the proofs of bispectrum invariance of the previous section does not depend on the specific fact that we are using the group of rotations $SO(3)$. Therefore, they can be readily generalized to create a more general vector-valued bispectrum on homogeneous spaces. The remaining TODO is to define the vector-valued Fourier transform in the general case, and prove its equivariance. - -\section{\color{deepred}{Domain $\Omega = (S^1 \times \mathbb{R}_+^*,~SO(2),~\ast)$ (disk rotations)}} - - -\subsection{Fourier Transform: Definition} - -Functions defined over a disk $D$ can be expanded on the disk harmonics as: -\begin{equation} - f(r, \theta)=\sum_{m, n} \hat{f}(m, n) d_{n m}(r, \theta), -\end{equation} -where $ d_{m m}(r, \theta)$ is the disk harmonics of coefficients $m, n$ given by: -\begin{equation} - d_{nm}(r, \theta)= J_m(2 \pi l_{n m} r) \exp (im \theta) -\end{equation} - -\textbf{The (vector) Fourier transform} $\hat{f}(m, n)$ for functions defined over a disk $D$ is: -\begin{align*} - \mathcal{F}(f)_{nm} - &= \frac{1}{a_{n m}} \int_0^{2 \pi} \int_0^1 f(r, \theta) J_m(2 \pi l_{n m} r) \exp(-i m \theta) r d r d\theta \\ - &=\left\{\begin{array}{c} -\frac{1}{2 \pi i m} a_{n m} \int_0^{2 \pi} F(l_{n m}, \phi) \exp(-i m \phi) d \phi \quad \text{for $l\neq 0$} \\ -F(0,0) / \pi \quad \text{for $l = 0$} -\end{array}\right\}, -\end{align*} - -where $F(l_{n m}, \phi) $ is the traditional Fourier transform of $f(r, \theta)$ written in polar coordinates. - -\subsection{Fourier Transform: Equivariance} - -Define the transformation of $f$ by $\tilde \theta$ as $(\tilde{\theta} \ast f)(r, \theta) = f(r, \tilde \theta +\theta )$. The Fourier transform undergoes a transformation by the same $\tilde \theta$, as follows, which shows its equivariance. - -\begin{align*} - \mathcal{F}(\tilde{\theta} \ast f)_{nm} - &= \frac{1}{a_{n m}} - \int_0^{2 \pi} \int_0^1 - (\tilde{\theta} \ast f)(r, \theta) J_m(2 \pi l_{n m} r) \exp(-i m \theta) - r dr d\theta \\ - &= \frac{1}{a_{n m}} - \int_0^{2 \pi} \int_0^1 - f(r, \tilde \theta + \theta) J_m(2 \pi l_{n m} r) \exp(-i m \theta) - r dr d\theta \\ - &= \frac{1}{a_{n m}} - \int_{\tilde{\theta}}^{2 \pi+\tilde{\theta}} \int_0^1 - f(r, \theta') J_m(2 \pi l_{n m} r) \exp(-i m (\theta' - \tilde{\theta})) - r dr d\theta'\\ - &= \frac{1}{a_{n m}} - \int_{\tilde{\theta}}^{2 \pi+\tilde{\theta}} \int_0^1 - f(r, \theta') J_m(2 \pi l_{n m} r) \exp(-i m \theta')\exp(+im\tilde{\theta}) - r dr d\theta' \\ - &= \exp(im\tilde{\theta}) .\frac{1}{a_{n m}} - \int_{\tilde{\theta}}^{2 \pi+\tilde{\theta}} \int_0^1 - f(r, \theta') J_m(2 \pi l_{n m} r) \exp(-i m \theta') - r dr d\theta' \\ - &= \exp(im\tilde{\theta}) .\frac{1}{a_{n m}} - \int_{0}^{2 \pi} \int_0^1 - f(r, \theta') J_m(2 \pi l_{n m} r) \exp(-i m \theta') - r dr d\theta' \\ - &= \exp(im\tilde{\theta}) . \mathcal{F}(f)_{nm} -\end{align*} - - -\subsection{Bispectrum: Definition} - -We generalize the bispectrum for signals defined over a space that is the direct product of $H$, homogeneous for a compact group, and $R$ invariant for that group. We do it here in the case of the disk. - -\textbf{The bispectrum for the disk} is defined as: -\begin{equation} - \beta(f)_{nmm'} = \mathcal{F}(f)_{nm}.\mathcal{F}(f)_{nm'}.\mathcal{F}(f)_{n(m+m')}^\dagger, -\end{equation} -where we observe that the third term only depends on the indices $m$, $m'$ that correspond to the homogeneous part of the disk, i.e. the one that transform with rotations in $SO(2)$. We recognize that we add these indices, since $SO(2)$ is a commutative group. - -\subsection{Bispectrum: Invariance} - - -Define the transformation of $f$ by $\tilde \theta$ as $(\tilde{\theta} \ast f)(r, \theta) = f(r, \tilde \theta +\theta )$. Under this group action, the bispectrum becomes: -\begin{align*} - \beta(\tilde{\theta} \ast f)_{nmm'} - &= \mathcal{F}(\tilde{\theta} \ast f)_{nm}.\mathcal{F}(\tilde{\theta} \ast f)_{nm'}.\mathcal{F}(\tilde{\theta} \ast f)_{n(m+m')}^\dagger\\ - &= \exp(im\tilde{\theta}) \mathcal{F}(f)_{nm}.\exp(im'\tilde{\theta}) \mathcal{F}(f)_{nm'}.\exp(-i(m+m')\tilde{\theta}) \mathcal{F}(f)_{n(m+m')}^\dagger\\ - &=\beta(f)_{nmm'}, -\end{align*} -which proves its invariance. - -\section{\color{deepred}{Domain $\Omega = (S^2 \times \mathbb{R}_+^*,~SO(3),~\ast)$ (ball rotations)}} - -\subsection{Fourier Transform: Definition} - -Functions defined over a ball $B$ can be expanded on the surface spherical harmonics as: -\begin{align*} - f(r, \theta, \phi) - &=\sum_{\ell=0}^{\infty} \sum_{m=-\ell}^{\ell} - \hat{f}_{\ell}^m r^{\ell} Y_{\ell}^m(\theta, \phi) -\end{align*} - - -\textbf{The (vector) Fourier transform} $\hat{f}_\ell$ for functions defined over a ball $B$ is (check?): -\begin{align*} - \mathcal{F}(f)_{l} - &\propto \int_0^{2 \pi}\int_0^{\pi} \int_0^1 f(r, \theta, \phi)^\dagger \left( r^{\ell} Y_{\ell}(\theta, \phi)\right) r d r \cos(\theta) d\theta d\phi \\ - &= \sqrt{\frac{2l+1}{4\pi}} \int_0^{2 \pi}\int_0^{\pi} \int_0^1 f(r, \theta, \phi)^\dagger \left( r^{\ell} [\rho_l(\phi, \theta, \gamma)]_0 \right) r d r \cos(\theta) d\theta d\phi \\ - &= \sqrt{\frac{2l+1}{4\pi}} \int_0^{2 \pi}\int_0^{\pi} \int_0^1 f(r, T_R(x_0))^\dagger \left( r^{\ell} [\rho_l(\phi, \theta, \gamma)]_0 \right) r d r \cos(\theta) d\theta d\phi \\ - &=\sqrt{\frac{2l+1}{4\pi}} \int_0^1 \left(\int_{R \in SO(3)} f(r, T_R(x_0))^\dagger [\rho_l(R)]_0. dR\right) r^{l+1} dr -\end{align*} - -\subsection{Fourier Transform: Equivariance} - -Define the transformation of $f$ by $\tilde R$ as $(\tilde{R} \ast f)(r, \theta, \phi) = f(r, \tilde R (\theta, \phi)) = f(T_{\tilde R}^{-1}.u)$. The (vector) Fourier transform undergoes a transformation by the same $\tilde R$, as follows, which shows its equivariance. - -\begin{align*} - \mathcal{F}(\tilde{R} \ast f)_{l} - &=\kappa_l \int_0^1 \left(\int_{R \in SO(3)} (\tilde{R} \ast f)(r, T_R(x_0))^\dagger [\rho_l(R)]_0. dR\right) r^{l+1} dr\\ - &=\kappa_l \int_0^1 \left(\int_{R \in SO(3)} f(r, T_R^{-1}.T_R(x_0))^\dagger [\rho_l(R)]_0. dR\right) r^{l+1} dr\\ - &=\kappa_l \int_0^1 \left(\int_{R \in SO(3)} f(r, T_{R^{-1}R}(x_0))^\dagger [\rho_l(R)]_0. dR\right) r^{l+1} dr\\ - &=\kappa_l \int_0^1 \left(\int_{R' \in SO(3)} f(r, T_{R'}(x_0))^\dagger [\rho_l(\tilde{R}R')]_0. \tilde{R}^{-1}dR'\right) r^{l+1} dr\\ - &=\kappa_l \int_0^1 \left(\int_{R' \in SO(3)} f(r, T_{R'}(x_0))^\dagger [\rho_l(\tilde{R})\rho_l(R')]_0. \tilde{R}^{-1}dR'\right) r^{l+1} dr\\ - &=\rho_l(\tilde{R}) . \kappa_l \int_0^1 \left(\int_{R' \in SO(3)} f(r, T_{R'}(x_0))^\dagger [\rho_l(R')]_0. \tilde{R}^{-1}dR'\right) r^{l+1} dr\\ - &=\rho_l(\tilde{R}) . \kappa_l \int_0^1 \left(\int_{R' \in SO(3)} f(r, T_{R'}(x_0))^\dagger [\rho_l(R')]_0. dR'\right) r^{l+1} dr\\ - &=\rho_l(\tilde{R}) . \mathcal{F}(f)_{l} \\ -\end{align*} - - -\subsection{Bispectrum: Definitions} - -We define the bispectrum as in the spherical function case: the only difference is the type of Fourier transform used, which is the one defined above. Then, both the definition and the proof of invariance of the bispectrum follow. - -\textbf{The (vector) bispectrum} of a ball function $f$ is a vector $\beta(f)_{l_1l_2}$ formed of the following scalar entries: -\begin{equation} - \beta(f)_{l_1l_2}[l] - := - \left[ - \mathcal{F}(f)_{l_1} \otimes \mathcal{F}(f)_{l_2} - \right] - C_{l_1l_2} \mathcal{F}_0(f)_l^{\dagger} - \qquad \in \mathbb{C}; \quad|l_1-l_2| \leq l \leq l_1+l_2. -\end{equation} -where $C_{l_1l_2}$ is the Clebsch-Gordan matrix associated with $\rho_{l_1} \otimes \rho_{l_2}$, and $\mathcal{F}_0(f)_l$ is the $(2l_1+1)(2l_2+1)$ vector padded with zeros: $\mathcal{F}_0(f)_l:=\left[0, \ldots, 0, \mathcal{F}_l, 0, \ldots, 0\right]$, where the number of zeros preceding $\mathcal{F}_i$ is $n_p$, and the number succeeding $\mathcal{F}_i$ is $n_s$, where $n_p:=\sum_{q=|k-\ell|}^{i-1}(2 q+1)$ and $n_s:=\sum_{q=i+1}^{k+\ell}(2 q+1)$. - -\subsection{Bispectrum: Invariance} - -The proof of invariance is identical to the proof of invariance for the $S^2$ case, since the Fourier transform on the ball has the same equivariance property as the Fourier transform on the sphere. - -\section{\color{deepred}{Domain $\Omega = (H \times R,~G,~\ast)$ (homogeneous $\times$ invariant space)}} - -\subsection{Fourier Transform: Definition} - - -\textbf{The (matrix) Fourier transform} for functions defined over $H \times R$ is: -\begin{align*} - \mathcal{F}(f)_{\rho} - &= \int_{r \in R} \int_{g \in G} f\left(T_g(x_0)\right) \rho(g)dg. dr \\ - &= \int_{r \in R} \int_{g \in G} f\left(r, T_g(x_0)\right) \rho(g)dg. dr -\end{align*} - -TODO: find how integral on $r$ should depends on $\rho$, by comparing to the disk and ball cases, in order to be a valid Fourier transform. - -\textbf{The (vector) Fourier transform} might exist in this case too, by analogy with the disk and ball cases. - -\subsection{Fourier Transform: Equivariance} - -Define the transformation of $f$ by $\tilde g$ as $(\tilde{g} \ast f)(r, x) = f(r, \tilde g^{-1} \ast x) = f(T_{\tilde g}^{-1}.x)$. The (vector) Fourier transform undergoes a transformation by the same $\tilde R$, as follows, which shows its equivariance. - -\begin{align*} - \mathcal{F}(\tilde{g} \ast f)_{\rho} - &= \int_{r \in R} \int_{g \in G} (\tilde{g} \ast f)\left(T_g(x_0)\right) \rho(g)dg. dr \\ - &= \int_{r \in R} \int_{g \in G} (\tilde{g} \ast f)\left(r, T_g(x_0)\right) \rho(g)dg. dr \\ - &= \int_{r \in R} \int_{g \in G} f(r, T_{\tilde{g}}^-1.T_g(x_0)) \rho(g)dg. dr \\ - &= \int_{r \in R} \int_{g \in G} f(r, T_{\tilde{g}^-1g}(x_0)) \rho(g)dg. dr \\ - &= \int_{r \in R} \int_{g' \in G} f(r, T_{g'}(x_0)) \rho(\tilde{g}g')dg'. dr \\ - &= \int_{r \in R} \int_{g' \in G} f(r, T_{g'}(x_0)) \rho(\tilde{g})\rho(g')dg'. dr \\ - &= \rho(\tilde{g}). \int_{r \in R} \int_{g' \in G} f(r, T_{g'}(x_0)) \rho(g')dg'. dr \\ - &= \rho(\tilde{g}) \mathcal{F}(f)_{\rho} -\end{align*} - - -Note that the equivariance does not depend on the dependency of the integral on $\rho$, thus any ``variant'' of the Fourier transform above will be equivariant. - -\subsection{Bispectrum: Definition} - -The definition of the bispectrum is identical to the its definition in the homogeneous case: only the Fourier transform used varies. - -\subsection{Bispectrum: Invariance} - -The invariance of the bispectrum follows from the proof of invariance on homogeneous spaces, since the Fourier transforms on $H \times R$ and on $H$ have the same equivariance properties. - -\section{\color{deepred}{Domain $\Omega = (\mathbb{Z}^2, G)$: Gauge Bispectrum for Feature Fields}} - -Consider the semi-direct product group $G = \mathbb{Z}^2 \ltimes H$, where $\mathbb{Z}_2$ is the domain. We consider a space of functions $f:\mathbb{Z}^2 \mapsto \mathbb{R}^K$ equipped with the representation $T$ of $G$ induced by a representation $\rho_H$ of $H$ on the fiber $\mathbb{R}^K$, and is denoted $T=\operatorname{Ind}_H^G \rho$. For a function $f$, the action of an element $(t, r) \in \mathbb{Z}^2 \ltimes H$ is: -\begin{equation} - \left[T_{t r} f\right](x)=\rho_H(r)\left[f\left((t r)^{-1} x\right)\right] \in \mathbb{R}^K -\end{equation} -Even if this uses notions of representations (e.g. $\rho_H$ and $\pi$, these are just there to explicit the action on the signal). - -\subsection{Fourier Transform: Definition} - -\textbf{The Fourier transform} for functions defined over a domain $\Omega$ but evolving according to the induced representation is defined as: -\begin{equation} -\mathcal{F}(f)_\rho = \widehat{f}(\rho ) = \int_{g \in G} \left[T_{t r} f\right](x_0) \otimes \rho(rt)^\dagger dg. -\end{equation} - -Here, we use the notation $\rho$ to denote the irreducible representation at which the Fourier coefficient is computed. It is NOT the induced representation of the full group $G = Z_2 \times H$, usually denoted $\pi$ in the steerable CNNs framework, nor $\rho_H$ the representation of the group $H$. - -\begin{remark} -We have: $\left[T_{t r} f\right](x_0) \in \mathbb{R}^K$ and $\pi(rt)$ can be a matrix of any dimension, as it depends on the dimension of the irreducible representation. - -Thus, what does the product $ \left[T_{t r} f\right](x_0)\pi(rt)$ even mean? It asks the question of what is the Fourier transform of a vector-valued signal. We add a tensor-product. Its intuition is that, at each $g \in G$ we build the $K$-vector that has a matrix at its $k$-component: specifically, $\left(\left[T_{t r} f\right](x_0)\right)_k$ the $k-th$ scalar component of the transformed signal that multiplies the $D \times D$ matrices $\rho(g)$ - -This is NOT the case where the Fourier transform of a vector-valued signal is defined as the concatenation of the Fourier transform of each of its scalar-valued components. Because, we would not know what group action to use on a signal scalar component $f_k$ of $f$. (unless the restriction of the action on $f$ to only its component $k$ is also an action, which I doubt). -\end{remark} - - -\subsection{Fourier Transform: Equivariance} - - -\subsection{Gauge Bispectrum: Via Intertwiner Basis} - -We consider a case where the output of the G-convolution has the same domain as the input. Then we can use the same basis functions. - -Consider a group $G = \mathbb{Z}^2 \times H$ and $Y$ a vector of stacked functions that form a steerable basis of $\mathbb{Z}^2$ for the group $G$. We need the basis to be steerable for the whole group, because the whole group acts on the domain of the signal. - -\begin{remark}[Which basis of functions to decompose the filter?] - In Steerable CNNs, the filter $\Psi$ is decomposed on a basis of functions $\Psi_l$. Yet, this might not be a basis of steerable functions. It is a basis of functions for the vector space $\text{Hom}(\pi, \rho)$ where $\pi$ is the regular representation (action on the signal's domain) and $\rho$ is a representation of $H$ of our choice. Here, we choose $\rho$ to be the trivial representation for now. - Additionally the basis of functions should be indexed by the irreducible representations of the group — in order to make sense for the downstream computations of the bispectrum. -\end{remark} - -The convolution is written as a spatial convolution in Steerable CNNs, which allows the output's domain to match the input's domain -\begin{align*} - \Theta(x_0) = (\Psi \ast f) (x_0) = \Psi^T. T_{x_0}f -\end{align*} -where $\Psi = [\Psi_{11}, ..., \Psi_{ss}]$ and $f = [f_{11}, ..., f_{ss}]$ are the values of the filter/signal in spatial format flattened into vectors, while $T_{x_0}f$ is the vector of values of a translated version of the signal. - -We write the convolution using the sum over the domain. In the implementation of Steerable CNNs, the signal is translated by $x_0$, not the filter: we apply the filter bank to translated versions of the signal. For the sake of the argument, we perform a change of variable to extract the (possibly steerable??) basis out of the expression of $\Psi$. -\begin{align*} - \Theta(x_0) = (\Psi \ast f) (x_0) - &= \sum_{x \in \Omega_s} \Psi(x).f(x_0 - x)\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \Psi(x_0 - x').f(x'), - \quad \text{(note: the domain changes through the change of variable)}\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \Psi(x_0 - x').f(x'),\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \left(\sum_l \hat{w}^{(l)} Y_l(x_0 - x')\right).f(x'), - \quad\text{(decomposition on the intertwiner's basis, denoted $Y$)}\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \left(\hat{w}^T. Y(x_0 - x')\right).f(x'), - \quad\text{(inner-product vectorial notation)}\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \left(\hat{w}^T. \rho^Y(-x')Y(x_0)\right).f(x'), - \quad\text{([!] assume the intertwiner's basis is steerable, by $\rho^Y$)}\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \left(\hat{w}^T. \rho^Y(-x')Y(x_0)\right).f(x')\\ - &= \left(\sum_{x' \in \Omega_s^{+x_0}} - \hat{w}^T. \rho^Y(-x').f(x')\right) Y(x_0) \in \mathbb{C}\\ - &= \hat{\Theta}^T.Y(x_0),\quad\text{(where $\hat{\Theta}, Y(x_0) \in \mathbb{C}^L$)} ,\\ - &=\sum_{l=1}^L \hat{\Theta}_l.Y_l(x_0) -\end{align*} -such that: $\hat{\Theta}_l = \left(\sum_{x' \in \Omega_s^{+x_0}} \hat{w}^T. \rho^Y(-x').f(x')\right)_l$, i.e. the $l$-th coordinate of this row vector. - -This would work if we can prove: (i) that the intertwiner basis is steerable for $G$ (see [!]), and (ii) that it is indexed by the irreducible representations. For [!], if the itertwiners' basis are not steerable, maybe we could express them in a steerable basis. - -We start with (i). We consider the trivial representation of $H$ in the definition of the intertwiners. THe vector space of intertwiners thus verifies the equation: -\begin{equation} - Y = Y.\pi(h),\quad \forall h \in H, -\end{equation} -where $Y = [Y_{11}, ..., Y_{ss}] \in \mathbb{C}^{1 \times s^2}$ is a intertwiner, written as the set of its values on the domain. $\pi(h) \in \mathbb{C}^{s^2.s^2}$, the matrix that can be applied to the values of a signal $f = [f_{11}, ..., f_{ss}] \in \mathbb{C}^{s^2}$ and amounts to rotating it. It is known as the regular representation. - -The equation above means that the solutions $Y$ are the set of eigenvectors of eigenvalue 1 for every matrix of the representation $\pi$: an invariant subspace of the representation $\pi$, i.e. a sub-representation. - - -\begin{remark} - We can rewrite this equation inn terms of coordinates on the domain: -\begin{equation} - Y(x_0) = \sum_{x \in \in \Omega_s} Y(x).\pi(h)_{xx_0}, -\end{equation} -by writing out the matrix multiplication explicitly and indexing the values of $Y$ by the pixel coordinate where that value is located. This equation holds for one element $Y$ of the set of basis functions. We need the whole set to prove the steerability. -\end{remark} - -Can the basis of the intertwiners be indexed by the irreps of $H$? To answer this question, we count how many basis functions there are. Writing $\rho_0$ is the trivial representation of $H$ on the fibers, and following the computation after Eq (11) in Steerable CNNs 2017, we have: -\begin{equation} - L = \text{dim}~\text{Hom}^H(\pi, \rho_0) = \sum_{\text{irreps }\psi } m^\pi_{\psi}.m^{\rho_0}_{\psi} = m^\pi_{\phi_0} -\end{equation} -since the multiplicity of the trivial representation $\rho_0$ is 0 except on itself where it is 1. In the above equation, $m^\pi_{\phi_0}$ is the multiplicity of the representation $\pi$ of $H$ on the trivial irreps of the group $H$. This multiplicity is $3$, as metnioned in Table 1 of the paper. - -We take the example of Table 1 of the Steerable CNNs paper. $H = D_4$ the roto-reflexion group. We decompose $\pi_0$ the representation of $G$ on the irreducible representations of $H$. Actually, we consider $\pi_0$ as a representation of $H$ and decompose this one. There are 3 elementary basis filters for the $\pi_0$, meaning that the dimension of Hom is 3, which is different from 5, the number of irreps of $D_4$. - -Thus, the number of basis functions in $\text{Hom}^H(\pi, \rho_0)$ is not equal to the number of irreps. We would not get the Fourier coefs as we need them for the bispectrum. - -Maybe we could define another bispectrum? - -\begin{remark}[If $\pi$ had been the regular representation of $H$] -$\pi$ is probably not the regular representation, because the reg representation has a fixed dimension and here it works for any s, it has shape $s^2 \times s^2$. - -From Wikipedia, we have: If G is a finite group and K is the complex number field, the regular representation decomposes as a direct sum of irreducible representations, with each irreducible representation appearing in the decomposition with multiplicity its dimension. Thus, the dimension of the intertwining space is 1, which is different from the number of irreps of the group. Thus, we cannot get the spectral coefficients by reading out the coefficients on the intertwining basis. - -On the other hand, why does the Steerable CNN paper talk about basis filter on the irreps?! As if there was one basis filter (i.e. a basis function) per irreps. - -Answer: this is the set of intertwiners when the $\rho$ chosen is an irreps. Which is our case, since our $\rho_0$ is the trivial representation. Contrarily to what we just proved, the basis for $\rho_0$, which is $A1$ has three elements. -\end{remark} - -\subsection{Bispectrum: from the intertwining coefs?} - -Goal: write the output of the convolution of a steerable CNN in terms of its “spectral” coefficients $\hat \Theta_l$ on a steerable basis of the domain. -Illustrative example: G = Z2 x D4, i.e. the example in the steerable CNN paper, where D4 is non-commutative. - -Remark: In a steerable CNN, the filter is expressed as “spectral” coefficients on a basis. -However, they do NOT use a steerable basis; -instead, they use on a intertwiners’ basis of H=D4 (see top of p4 of the Steerable CNNs paper). -Let’s assume for now that the intertwiners’ basis is a steerable basis. - -Result: The output of the steerable convolution can be written in terms of its “spectral” coefficients $\hat \Theta_l$on the intertwiner basis (screenshot & details in overleaf). - -Next step: Compute the bispectrum from the spectral coefficients $\hat \Theta_l$ . - -If we want to use an existing formula of the bispectrum: -we need the L spectral coeffs $\hat \Theta_l$ to correspond to the M Fourier coeffs of Theta — where M is the number of irreps of the group. ---> we need, at least, to have L = M. -However, that is not the case for the example of D4: we have L=3 spectral coeffs but M=5 irreps of D4 (see Table 1 in Steerable CNNs). -Thus, we need a new formula for the bispectrum, written in terms of the $\hat \Theta_l$ -Questions: ----> How do we generalize the bispectrum, for a non-commutative group H, when we don’t have the Fourier coefs of the signal, but rather its coefs on an intertwining basis? (that is, maybe, also a steerable basis?) ----> If we find a formula for it, what do we expect it to be invariant to? I’d say invariant to action of H on the domain. - -Since we would expect this bispectrum to be invariant to the action of H on the domain, we compute the TC for this action, and then take its Fourier transform. - -This is the TC for the action of rotation on the domain. which is not a homogeneous domain. Maybe we could take the disk bispectrum then? And write everything in disk harmonics? The disk harmonics are steerable by $\rho(\theta) = \exp(-im\theta)$ just as the ring harmonics. - -Let's rewrite the output of the steerable convolution using the disk harmonics. -\begin{align*} - \Theta(x_0) = (\Psi \ast f) (x_0) - &= \sum_{x \in \Omega_s} \Psi(x).f(x_0 - x)\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \Psi(x_0 - x').f(x'), - \quad \text{(note: the domain changes through the change of variable)}\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \left(\sum_l \hat{w}^{(l)} Y_l(x_0 - x')\right).f(x'), - \quad\text{(decomposition on the intertwiner's basis, denoted $Y$)}\\ - &= \sum_{x' \in \Omega_s^{+x_0}} - \left(\sum_l \hat{w}^{(l)} \sum_{m,n}\hat{Y_l}(m, n) d_{m, n}(r_{x_0 - x'}, \theta_{x_0 - x'})\right).f(x'), - \quad\text{(decomposition on the harmonics basis, denoted $Y$)}\\ - &= \sum_{m,n} \left(\sum_{x' \in \Omega_s^{+x_0}} - \sum_l \hat{w}^{(l)} \hat{Y_l}(m, n).f(x')\right) d_{m, n}(r_{x_0 - x'}, \theta_{x_0 - x'}), - \quad\text{(getting the coefficients on the harmonics)} - % &= \sum_{x' \in \Omega_s^{+x_0}} - % \left(\hat{w}^T. Y(x_0 - x')\right).f(x'), - % \quad\text{(inner-product vectorial notation)}\\ - % &= \sum_{x' \in \Omega_s^{+x_0}} - % \left(\hat{w}^T. \rho^Y(-x')Y(x_0)\right).f(x'), - % \quad\text{([!] assume the intertwiner's basis is steerable, by $\rho^Y$)}\\ - % &= \sum_{x' \in \Omega_s^{+x_0}} - % \left(\hat{w}^T. \rho^Y(-x')Y(x_0)\right).f(x')\\ - % &= \left(\sum_{x' \in \Omega_s^{+x_0}} - % \hat{w}^T. \rho^Y(-x').f(x')\right) Y(x_0) \in \mathbb{C}\\ - % &= \hat{\Theta}^T.Y(x_0),\quad\text{(where $\hat{\Theta}, Y(x_0) \in \mathbb{C}^L$)} ,\\ - % &=\sum_{l=1}^L \hat{\Theta}_l.Y_l(x_0) -\end{align*} -To conclude, we would need the harmonics to be steerable by the translations. - - - -\subsection{Gauge Triple Correlation: Definition} - -We define a new notion of triple correlation that works for vectorial functions (feature fields) equipped with the action of a semi-direct group $\mathbb{Z}^2 \ltimes H$ via the induced representation. In this setting, the group action does not only act on the domain $\mathbb{Z}^2$ of the function, but also transforms its values in the fiber $\mathbb{R}^K$ --- i.e., it is a gauge transformation. In practice, such signals arise as outputs of steerable G-convolutions: after the first layer, the function is not a function over the group (as is the case for the classic G-conv) but is still a function over $\mathbb{Z}^2$ equipped with this induced group action. - -We wonder whether we can generalize the triple correlation to this case. We show below that we can. - -We modify the definition of the triple correlation by inverting the order of $gg_1$ to $g_1g$: - - -We define a triple correlation applicable to this class of functions: -\begin{equation} - T(f)_{g_1g_2} - = \int_{\mathbb{Z}^2} - \int_H - T_{rt}[f]^\dagger (x_0) T_{r_1t_1rt}[f](x_0) T_{r_2t_2rt}[f](x_0) - drdt \in \mathbb{R}^K, -\end{equation} -where $g = rt$, $g_1 = r_1t_1$ and $g_2 = r_2 t_2$. - -We note that the triple correlation is a vector in $\mathbb{R}^K$, i.e. in the space representing the fiber where $K$ is the number of channels. We also note that we only use one element of the domain $x_0 \in \mathbb{Z}^2$ to define the TC: this is a similar approach as what was done for the homogeneous case. The domain is homogeneous for the action of $G$. By varying $g \in G$, we will see every value of the function. - -\subsection{Triple Correlation: Invariance} - -We prove invariance of the gauge TC. - -We begin with a Lemma: - -\begin{lemma} -Composing the group actions corresponding to the induced representation: - \begin{equation} - T_{rt}[T_{r't'}[f]] (x) - = \rho(r) \left[[T_{r't'}[f]]\left((t r)^{-1} x\right)\right] - = \rho(r) \rho(r') f((t'r')^{-1}(tr)^{-1}x) \in \mathbb{R}^K -\end{equation} -\end{lemma} - - -Consider a second function that is obtained from $f$ by an action of a group element $h = r_ht_h$, i.e. we have: $f_2 = T_h[f] = T_{r_ht_h}[f]$. I.e. $f_2$ is in the orbit of $f$ for the action of the induced representation. - -\begin{proof} - -We prove that $T(f_2)_{g_1g_2} = T(f)_{g_1g_2} $, which proves the invariance of the TC for the action of the induced representation. - -\begin{align*} - T(f_2)_{g_1g_2} - &= \int_{\mathbb{Z}^2} \int_H - T_{rt}[f_2]^\dagger (x_0) - T_{r_1t_1rt}[f_2](x_0) - T_{r_2t_2rt}[f_2](x_0) - dtdr \\ - &= \int_{\mathbb{Z}^2} \int_H - T_{rt}[T_{r_ht_h}[f]]^\dagger (x_0) - T_{r_1t_1rt}[T_{r_ht_h}[f]](x_0) - T_{r_2t_2rt}[T_{r_ht_h}[f]](x_0) - dtdr \\ - &= \int_{\mathbb{Z}^2} \int_H - \left(\rho(r)\rho(r_h) - f((t_hr_h)^{-1}(tr)^{-1}x_0)\right)^\dagger \\ - &\qquad\qquad\qquad.\left( - \rho(r_1)\rho(r)\rho(r_h) - f((t_hr_h)^{-1}(tr)^{-1}(t_1r_1)^{-1}x_0)\right)\\ - &\qquad\qquad\qquad.\left( - \rho(r_2)\rho(r)\rho(r_h) - f((t_hr_h)^{-1}(tr)^{-1}(t_2r_2)^{-1}x_0)\right) dtdr -\end{align*} -We will prove the rest using the example SE(n) of a semi-direct product group $\mathbb{Z}_2 \ltimes H$. - -We recall that, e.g. in SE(n): -\begin{itemize} - \item the inversion writes: $(tr)^{-1} = (r^{-1}, R^{-1}(-t))$ - \item and the action on an element of the domain writes: $(R, t)x = Rx+t$ . -\end{itemize} -Note: for a general subgroup $H$, replace R by $\phi(r)$ i.e. a representation of $H$ on $\mathbb{Z}_2$ that transforms $r \in H$ into something that acts on $\mathbb{Z}^2$. - -Note2: Triple check this. - -We expand this: -\begin{align*} - (t_hr_h)^{-1}(tr)^{-1} x_0 - &= R_h^{-1}(R^{-1}x_0 - R^{-1}t) - R_h^{-1}t_h \\ - &= R_h^{-1}R^{-1}x_0 - R_h^{-1}R^{-1}t- R_h^{-1}t_h -\end{align*} -and: -\begin{align*} - (t_hr_h)^{-1}(tr)^{-1}(t_1r_1)^{-1} x_0 - &= (t_hr_h)^{-1}(tr)^{-1} (R_1^{-1}x_0 - R_1^{-1}t_1) \\ - &= R_h^{-1}(R^{-1}R_1^{-1}x_0 - R^{-1}R_1^{-1}t_1 - R^{-1}t) - R_h^{-1}t_h \\ - &= R_h^{-1}R^{-1}R_1^{-1}x_0 - R_h^{-1}R^{-1}R_1^{-1}t_1 - R_h^{-1}R^{-1}t - R_h^{-1}t_h \\ -\end{align*} - -We first perform the change of variable $r' = rr_h$, and $t'=Rt_h+t$ which gives: -\begin{align*} - \rho(r)\rho(r_h) &= \rho(r') -\end{align*} -And for the part that act on the domains, using the fact that $R_h^{-1} = R'^{-1}R$: -\begin{align*} - (t_hr_h)^{-1}(tr)^{-1}x_0 - &= R'^{-1}x_0 - R'^{-1}t-R'^{-1}Rt_h \\ - &= R'^{-1}x_0 - R'^{-1}(t+Rt_h) \\ - &= R'^{-1}x_0 - R'^{-1}t' \\ - &= (t'r')^{-1}x_0 -\end{align*} - - as well as: - \begin{align*} - (t_hr_h)^{-1}(tr)^{-1}(t_1r_1)^{-1} x_0 &=(t'r')^{-1}(t_1r_1)^{-1} x_0 - \end{align*} - -Thus, we can continue the computation of the TC: -\begin{align*} - T(f_2)_{g_1g_2} - &= \int_{\mathbb{Z}^2} \int_H - \left(\rho(r)\rho(r_h) - f((t_hr_h)^{-1}(tr)^{-1}x_0)\right)^\dagger(x_0) \\ - &\qquad\qquad\qquad.\left( - \rho(r_1)\rho(r)\rho(r_h) - f((t_hr_h)^{-1}(tr)^{-1}(t_1r_1)^{-1}x_0)\right)\\ - &\qquad\qquad\qquad.\left( - \rho(r_2)\rho(r)\rho(r_h) - f((t_hr_h)^{-1}(tr)^{-1}(t_2r_2)^{-1}x_0)\right) dtdr\\ - &= \int_{\mathbb{Z}^2} \int_H - \left(\rho(r') - f((t'r')^{-1}x_0)\right)^\dagger(x_0) \\ - &\qquad\qquad\qquad.\left( - \rho(r_1)\rho(r') - f((t'r')^{-1}(t_1r_1)^{-1}x_0)\right)\\ - &\qquad\qquad\qquad.\left( - \rho(r_2)\rho(r') - f((t'r')^{-1}(t_2r_2)^{-1}x_0)\right) dt'dr'\\ - &=T(f)_{g_1g_2} -\end{align*} -\end{proof} - -\subsection{Gauge Bispectrum: Definition} - - - -\begin{proof} -We have a group $G = \mathbb{Z}_2 \times H$. We use the convention $g = (t, r) = tr$ for a group element decomposing into a translation component and a rotation (later, of any compact group) one. - -By definition, the gauge bispectrum is the Fourier transform of the gauge triple correlation. We have defined the Fourier transform associated with the induced representation's action. - -We compute this Fourier transform for the product group $G \times G$ and show that we obtain the expression given above. We recall that $T(f)_{g_1, g_2} \in \mathbb{C}^{K}$. The terms $T_{g}[f]^\dagger T_{g_1g}[f]$ define an inner product and need to stick together. - - -We define it for any action of $g$ on a vectorial signal, where $g$ can touch both the fiber and the domain. The action is not restricted to the induced representation, thus we use $g$ and not $rt$. A remaining question is whether the induced representation brings something more? Or why does it seem to be important to have the induced representation in the TC but not for the BiSp? It is probably enough as long as the action is homogeneous? Or maybe, in order for it to be an action on fiber+domain it has to be some type of induced representation. Otherwise it does not make sense? -Associativity of mixed tensor-product/matrix multiplication operation -%https://math.stackexchange.com/questions/3029078/associativity-of-mixed-matrix-product-and-tensor-product - -The following assumes that: $v \otimes (AB) = (v\otimes A). B$ for $v\in\mathbb{C}^K$ and $A, B \in \mathbb{C}^{D \times D}$ - - \begin{align*} - \beta(f)_{\rho_1, \rho_2} - &= \int_{g_1 \in G} \int_{g_2 \in G} - T(f)_{g_1, g_2} \otimes - \left[ - \rho_1(g_1)^\dagger \otimes \rho_2(g_2)^\dagger - \right] - dg_1 dg_2 \\ - &= - \int_{g_1 \in G} \int_{g_2 \in G} - \int_{g \in G} - \left[ T_{g}[f]^\dagger (x_0) T_{g_1g}[f](x_0) T_{g_2g}[f](x_0) - \right]dg - \otimes - \left[ - \rho_1(g_1)^\dagger \otimes \rho_2(g_2)^\dagger - \right] - dg_1 dg_2 \\ - &=\int_{g \in G} - \int_{g_1 \in G} \int_{g_2 \in G} - \left[T_{g}[f]^\dagger (x_0)T_{g_1g}[f](x_0) T_{g_2g}[f](x_0) - \right] - \otimes - \left[ - \rho_1(g_1)^\dagger \otimes \rho_2(g_2)^\dagger - \right] - dg_1 dg_2dg\\ - &=\int_{g \in G} - \int_{g_1 \in G} \int_{g_2 \in G} - T_{g}[f]^\dagger (x_0) T_{g_1}[f](x_0) T_{g_2}[f](x_0) - \otimes - \left[ - \rho_1(g_1g^{-1})^\dagger \otimes \rho_2(g_2g^{-1})^\dagger - \right] - dg_1 dg_2 dg\\ - &=\int_{g \in G} - \int_{g_1 \in G} \int_{g_2 \in G} - [...] - \otimes - \left[ - \rho_1(g_1)^\dagger \rho_1(g^{-1})^\dagger \otimes \rho_2(g_2)^\dagger \rho_2(g^{-1})^\dagger - \right] - dg_1 dg_2dg\\ - &=\int_{g \in G} - \int_{g_1 \in G} \int_{g_2 \in G} - [...] - \otimes - \left[ - \rho_1(g_1)^\dagger \rho_1(g) \otimes \rho_2(g_2)^\dagger \rho_2(g) - \right] - dg_1 dg_2dg\\ - &=\int_{g \in G} - \int_{g_1 \in G} \int_{g_2 \in G} - [...] - \otimes \left( - \left[ - \rho_1(g_1)^\dagger \otimes \rho_2(g_2)^\dagger \right] . \left[\rho_1(g) \otimes \rho_2(g) - \right] \right) - dg_1 dg_2dg\\ - &=\int_{g \in G} - \int_{g_1 \in G} \int_{g_2 \in G} - \left(T_{g}[f]^\dagger (x_0) T_{g_1}[f](x_0) T_{g_2}[f](x_0) - \otimes - \left[ - \rho_1(g_1)^\dagger \otimes \rho_2(g_2)^\dagger \right]\right) . - dg_1 dg_2\left[\rho_1(g) \otimes \rho_2(g) - \right] dg\\ - &=\int_{g \in G} - T_{g}[f]^\dagger (x_0) \left( - \int_{g_1 \in G} \int_{g_2 \in G} - T_{g_1}[f](x_0) T_{g_2}[f](x_0) - \otimes - \left[ - \rho_1(g_1)^\dagger \otimes \rho_2(g_2)^\dagger \right]\right) . - dg_1 dg_2\left[\rho_1(g) \otimes \rho_2(g) - \right] dg\\ - &=\int_{g \in G} - T_{g}[f]^\dagger (x_0) - \left[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}\right] \left[\rho_1(g) \otimes \rho_2(g) - \right] dg\\ - &=\left[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}\right] - \int_{g \in G} - T_{g}[f]^\dagger (x_0) - \left[\rho_1(g) \otimes \rho_2(g) - \right] dg\\ - &=\left[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}\right] - \int_{g \in G} - T_{g}[f]^\dagger (x_0) \otimes - \left[ - C_{\rho_1, \rho_2} - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - \rho(g) - C_{\rho_1, \rho_2} ^\dagger - \right] - dg\\ - &=\left[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}\right] - \int_{g \in G} - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - T_{g}[f]^\dagger (x_0) \otimes - \left[ - C_{\rho_1, \rho_2} - \rho(g) - C_{\rho_1, \rho_2} ^\dagger - \right] - dg\\ - &=\left[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}\right] - C_{\rho_1, \rho_2} - \int_{\mathbb{Z}^2} - \int_H - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - T_{g}[f]^\dagger (x_0) \otimes - \left[ - \rho(g) - \right] - dg C_{\rho_1, \rho_2} ^\dagger \\ - &=\left[\mathcal{F}(f)_{\rho_1} \otimes \mathcal{F}(f)_{\rho_2}\right] - C_{\rho_1, \rho_2} - \bigoplus_{\rho \in \rho_1 \otimes \rho_2} - \mathcal{F}(f)_\rho C_{\rho_1, \rho_2} ^\dagger \\ - \end{align*} -\end{proof} - -TO CHECK - -\section{Physics-Invariance} -Consider $f$ a solution to a PDE, defined on $\mathbb{R}^2 \times \mathbb{R}$, i.e., on a space-time domain, and with values in some co-domain. - -Consider the group $G$ of its symmetries, which are actions on $f$. Most of these actions are: linear actions acting only on the domain of $f$, which is likely homogeneous for the action, thus this fits to one of the cases listed here. Other actions are linear actions that act on both domain and fiber (gauge transformations), thus this fits into one of the cases listed here. For the remaining non-linear actions, we can define a Fourier transform, and bispectrum, for this case? - -For example, we can think of building a transformer whose attention coef are invariant thanks to the bispectrum. If we do this, does this mean that we should work in the fourier domain, for the whole network? What does it mean to solve a PDE in Fourier domain? - -\section{Scratch} - -\subsection{Triple Correlation: Definition (Continuous case/Comp. Cost: Try 1)} - -We try to generalize the triple correlation for the case where the subgroup $H$ is continuous, i.e. for when H is a Lie group. We use H = SO(n) as our running example. - -The main ingredient for the gauge TC is the action of a group. Thus, the trick is to turn this action into the action of the associated Lie algebra, and use the generators of the Lie algebra. The Lie algebra of SO(n) admits three generators that we write $A_1, A_2, A_3$ (in matrix form) or $a_1, a_2, a_3$ (in abstract form). - -We show that it is enough to define the TC only on these three generators, to define the whole TC. -\begin{equation} - T(f)_{a^it_1a^jt_2} - = \int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - T_{at}[f]^\dagger (x) T_{a^it_1at}[f](x) T_{a^jt_2at}[f](x) - dadt, -\end{equation} -for $i, j \in \{1, 2, 3\}$ and any $t_1, t_2 \in \mathbb{Z}^2$. Also, we have: $g = \exp(a)t$, $g_1 = \exp(a^i)t_1$ and $g_2 = \exp(a^j) t_2$ and we define: -\begin{equation} - T_{at}[f](x) = \rho(\exp(a))f((t\exp(a))^{-1}x_0). -\end{equation} - -\begin{lemma}[Group \& algebra representations] -For a lie algebra reps $t(a)\in M_{d\times d}$ of $a \in\mathfrak{h}$ where $r(a) = \exp(a)$ is the corresponding group element: -\begin{equation} - T_{r(a)} = T_{\exp(a)} = \exp t(a) \in GL_{d \times d}. -\end{equation} -For example, for the representation $\phi$ that appears in the next lemma: -\begin{equation} - \phi\left(\exp\left(-a\right)\right) = \exp\left(-\sigma(a) \right), -\end{equation} -where $\sigma$ is the lie algebra representation corresponding to the group representation $\phi$. -\end{lemma} - -\begin{lemma}[Action of an inverse element on $x$] - For $a \in \mathfrak{h}$ where $a = \sum_{l=1}^3 w_l a^l$ and $r = \exp(a)$, we have: - \begin{align*} - \left(tr\right)^{-1}x - &= \left( - r^{-1}, -R^{-1} t\right)x \\ - &= \left( - \exp\left(a\right)^{-1}, -\phi\left(\exp\left(a\right)\right)^{-1} t\right)x \\ - &= \left( - \exp\left(-a\right), -\phi\left(\exp\left(-a\right)\right) t\right)x \\ - &= \left( - \exp\left(-a\right), -\exp\left(-\sigma(a) \right) t\right)x \\ - &= \exp\left(-a\right)x - \exp\left(-\sigma(a) \right) t - \end{align*} -\end{lemma} - -In the following lemma, we use convenient notations that will help for the last derivation of this page. - -\begin{lemma}[Action on the signal $f$] - For $a_2 \in \mathfrak{h}$ where $a_2 = \sum_{l=1}^3 w_l a^l$, and a function signal $F$, we have: - \begin{align*} - T_{a_2t_2}[F](x) - &= \rho(\exp(a_2))F((t_2\exp(a_2))^{-1}x)\\ - &= \exp(\tau(a_2)) F\left[\exp\left(-a_2\right)x - \exp\left(-\sigma(a_2) \right) t_2\right] \\ - &= \exp\left(\tau\left(\sum_{l=1}^3 w_l a^l\right)\right) - F\left[ - \exp\left(-\sum_{l=1}^3 w_l a^l\right)x - - \exp\left(-\sigma(\sum_{l=1}^3 w_l a^l) \right) t_2 - \right] \\ - &= \exp\left( -\sum_{l=1} w_l \sigma(a^l)\right) - F\left[ - \exp\left(-\sum_{l=1}^3 w_l a^l\right)x - - \exp\left(-\sigma(\sum_{l=1}^3 w_l a^l) \right) t_2 - \right] - \end{align*} - -For the next computations, we assume that the group $H$ is commutative, so that $\exp(A+B) = \exp(A)\exp(B).$ -\begin{align*} - T_{a_2t_2}[F](x) - &= \exp\left( -\sum_{l} w_l \sigma(a^l)\right) - F\left[ - \exp\left(-\sum_{l} w_l a^l\right)x - - \exp\left(-\sigma(\sum_{l} w_l a^l) \right) t_2 - \right]\\ - &= \Pi_{l}\exp\left( -w_l \sigma(a^l)\right) - F\left[ - \Pi_{l}\exp\left(-w_l a^l\right)x - - \exp\left(-\sigma(\sum_{l} w_l a^l) \right) t_2 - \right] - \end{align*} -This seems too complicated. We start again. We note that: -\begin{align*} - T_{a_2t_2}[F](x) - &= T_{\exp(a_2)t_2}[F](x) \\ - &= T_{\exp(\sum_{l=1}^3 w_l a^l)t_2}[F](x) \\ - &= T_{\Pi_{l=1}^3\exp(w_l a^l)t_2}[F](x) \\ - &= T_{\Pi_{l=1}^3\left(\exp(a^l)\right)^{w_l}t_2}[F](x) \\ - &= \Pi_{l=1}^3\left(T_{\exp(a^l)}\right)^{w_l}T_{t_2}[F](x) \\ -\end{align*} -\end{lemma} - -Now, we show that any $T(f)_{a_1t_1a_2t_2}$ can be expressed as a function of $T(f)_{a_it^1a^jt_2}$. By symmetry in $a_1, a_2$, we only prove it for $T(f)_{a^it_1a_2t_2}$. - -For $a_2 \in \mathfrak{h}$ where $a_2 = \sum_{l=1}^3 w_l a^l$, we have: -\begin{align*} - T(f)_{a^it_1a_2t_2} - &= \int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - T_{at}[f]^\dagger (x) T_{a^it_1at}[f](x) T_{a_2t_2at}[f](x) - dadt \\ - &= \int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - T_{at}[f]^\dagger (x) T_{a^it_1at}[f](x) T_{a_2t_2}[T_{at}(f)](x) - dadt \\ - &=\int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - F^\dagger (x) T_{a^it_1}[F](x) T_{a_2t_2}[F](x) - dadt \quad \text{notation: $F = T_{at}(f)$}\\ - &=\int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - F^\dagger (x) T_{a^it_1}[F](x) \Pi_{l=1}^3\left(T_{\exp(a^l)}\right)^{w_l}T_{t_2}[F](x) - dadt -\end{align*} -Here, we are blocked because we cannot unpack the product $\Pi_l$. - -\subsection{Triple Correlation: Definition (Continuous case/Comp. Cost: Try 2)} - -We consider the TC as an operator: -\begin{align*} - TC: \mathcal{F} \times \mathfrak{g}^2 &\mapsto \mathbb{R}^K \\ - f, (t_1a_1, t_2 a_2) &\mapsto T(f)_{t_1a_1t_2a_2} -\end{align*} -This is not a linear operator, thus it cannot be represented by a big tensor. This is the main difference with the case of the convolution: the convolution being a linear operator, we can represent it as a big tensor that contains the whole filter bank. The nonlinearity in $f$ comes from the triple product. The nonlinearity in $a_2$ comes from the fact that we were not able to prove it in Try 1. - -Let's try again though. With the discrete group case for now. In the convolution case, all the rotated filters are included in the filter bank. If we think in the same way for the TC, this means that we should see the TC as: -\begin{align*} - TC: \mathcal{F}&\mapsto \mathbb{R}^{K \times \|G\|^2} \\ - f &\mapsto \left[T(f)_{t_1a_1t_2a_2}, ..., ... \right], -\end{align*} -where on the output we have all the values of the TC for all the (non redundante) pairs of group elements. - -We have $\mathcal{F} = \{f:\mathbb{Z}^2 \mapsto \mathbb{R}^K \} = \mathbb{R}^{S^2.K} $ where $S$ is the side of the $\mathbb{Z}^2$ grid that supports the image $f$. - -As an operator on $f$, what is the polynomial order of the TC? - -\begin{align*} - TC(\mu f+\lambda g) - &= \int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - T_{at}[\mu f+\lambda g]^\dagger (x) - T_{a_1t_1at}[\mu f+\lambda g](x) - T_{a_2t_2at}[\mu f+\lambda g](x) - dadt \\ - &= \int_{t \in \mathbb{Z}^2} - \int_{a \in \mathfrak{h}} - \left(\mu T_{at}[f] + \lambda T_{at}[g]\right)^\dagger (x) - \left(\mu T_{a_1t_1at}[f] + \lambda T_{a_1t_1at}[g]\right) (x) - \left(\mu T_{a_2t_2at}[f] + \lambda T_{a_2t_2at}[g]\right) (x) - dadt \\ - &= ...\text{not equal to $ \mu TC(f) +\lambda TC(g)$, nor with its higher orders, bcs we have crossed terms with $f, g$} -\end{align*} - -Thus, TC is just an invariant function on $f$. Since it is not linear, we cannot represent it as a matrix and write the intertwiner equation of the type $T \pi(g) = \rho(g) T$ that was useful to find a basis for the filters in the G-conv of the gauge case. - -\subsection{Triple Correlation: Definition (Continuous case/Comp. Cost: Try 3)} - -The last idea would be to think of the triple correlation as an implicit representation. For example, we could implement it as a continuous function (a neural network) takes a pair $(g_1, g_2)$ as input and output the $T(f)_{g_1g_2}$. The NN could implement the ansatz of the triple correlation, e.g. have a triple product structure that is able to evaluate the TC each time $f, g_1, g_2$ is given. The weights of this neural network would contain everything we need about the TC, without having to evaluate it at each pair of group elements. However, it is possible that we only shift the problem is that the way of implementing the TC as an implicit function is going to be even more computationally expensive that computing all of the values of the TC. - -\subsection{More comments} - -The computational cost mostly comes from the translation part, i.e. from the size of the grid of the images. We note that, for steerable CNNs, only the abstraction related to the group H in the semi direct product $G = H \times Z^2$ is used in the filter bank coefficients. For the translation part, there is no computational gain: the filter bank is still moved at each position during the convolution. This could be an argument in favor of not trying to use the gauge bispectrum strategy for complexity gain. - -\subsection{More comments: continuous case} - -Since the obstruction to using the gauge bispectrum strategy is also the fact that the TC is non linear, we could try to go back to a situation where we have a linear operator. For example, we could consider the bispectrum which in the discrete setting is of the form -\begin{equation} - \beta(x) = Ux \otimes Vx \otimes Wx -\end{equation} -where $U, V, W$ are different realization of the discrete Fourier transform. - -Considering the case of the continuous fourier transform instead, we know that the Fourier transform is an equivariant linear operator: -\begin{equation} - W\phi(g) = \rho(g) W, -\end{equation} -when $W$ is the discrete fourier matrix. This equation should hold for the case where the image is discrete (discrete in translation) but H is continuous. The continuous fourier transform in H could be decomposed into a discrete set of coefficients on a equivariant basis of intertwiners. This could make the (fixed, not learnable) bispectrum neural network applicable to continuous groups. - -We need the fourier transform for the gauge case, though. - - -\bibliographystyle{plos2015} -\bibliography{references.bib} - -\end{document} diff --git a/docs/cohen_et_al_2018/1801.10130 b/docs/cohen_et_al_2018/1801.10130 deleted file mode 100644 index 74a32c2..0000000 Binary files a/docs/cohen_et_al_2018/1801.10130 and /dev/null differ diff --git a/docs/cohen_et_al_2018/equivariance_error.pgf b/docs/cohen_et_al_2018/equivariance_error.pgf deleted file mode 100644 index 8eb8b76..0000000 --- a/docs/cohen_et_al_2018/equivariance_error.pgf +++ /dev/null @@ -1,1904 +0,0 @@ -%% Creator: Matplotlib, PGF backend -%% -%% To include the figure in your LaTeX document, write -%% \input{.pgf} -%% -%% Make sure the required packages are loaded in your preamble -%% \usepackage{pgf} -%% -%% Figures using additional raster images can only be included by \input if -%% they are in the same directory as the main LaTeX file. For loading figures -%% from other directories you can use the `import` package -%% \usepackage{import} -%% and then include the figures with -%% \import{}{.pgf} -%% -%% Matplotlib used the following preamble -%% \usepackage{fontspec} -%% \setmainfont{DejaVu Serif} -%% \setsansfont{DejaVu Sans} -%% \setmonofont{DejaVu Sans Mono} -%% -\begingroup% -\makeatletter% -\begin{pgfpicture}% -\pgfpathrectangle{\pgfpointorigin}{\pgfqpoint{2.900000in}{3.000000in}}% -\pgfusepath{use as bounding box, clip}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetmiterjoin% -\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.000000pt}% -\definecolor{currentstroke}{rgb}{1.000000,1.000000,1.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{2.900000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{2.900000in}{3.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{3.000000in}}% -\pgfpathclose% -\pgfusepath{fill}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetmiterjoin% -\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.000000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetstrokeopacity{0.000000}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{2.790000in}}% -\pgfpathlineto{\pgfqpoint{0.435000in}{2.790000in}}% -\pgfpathclose% -\pgfusepath{fill}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{1.772096in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.268333in,y=1.719335in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{2.003438in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=1.950676in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0.5\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{2.234780in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.268333in,y=2.182018in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 1\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{2.466122in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=2.413360in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 1.5\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{2.697463in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.268333in,y=2.644702in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 2\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.104753in,y=2.281048in,,bottom,rotate=90.000000]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle \Delta\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.483769in}{1.783912in}}% -\pgfpathlineto{\pgfqpoint{0.483769in}{1.818095in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.516281in}{1.849113in}}% -\pgfpathlineto{\pgfqpoint{0.516281in}{1.866725in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.548793in}{1.870961in}}% -\pgfpathlineto{\pgfqpoint{0.548793in}{1.882312in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.581306in}{1.882076in}}% -\pgfpathlineto{\pgfqpoint{0.581306in}{1.891216in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.613818in}{1.897080in}}% -\pgfpathlineto{\pgfqpoint{0.613818in}{1.904510in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.646331in}{1.906780in}}% -\pgfpathlineto{\pgfqpoint{0.646331in}{1.913452in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.678843in}{1.920179in}}% -\pgfpathlineto{\pgfqpoint{0.678843in}{1.926422in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.711356in}{1.922744in}}% -\pgfpathlineto{\pgfqpoint{0.711356in}{1.927832in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.743868in}{1.932843in}}% -\pgfpathlineto{\pgfqpoint{0.743868in}{1.937620in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.776380in}{1.941860in}}% -\pgfpathlineto{\pgfqpoint{0.776380in}{1.946492in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.808893in}{1.950626in}}% -\pgfpathlineto{\pgfqpoint{0.808893in}{1.954688in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.841405in}{1.953029in}}% -\pgfpathlineto{\pgfqpoint{0.841405in}{1.956923in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.873918in}{1.960773in}}% -\pgfpathlineto{\pgfqpoint{0.873918in}{1.964329in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.906430in}{1.972321in}}% -\pgfpathlineto{\pgfqpoint{0.906430in}{1.975998in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.938942in}{1.974781in}}% -\pgfpathlineto{\pgfqpoint{0.938942in}{1.978354in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.971455in}{1.976999in}}% -\pgfpathlineto{\pgfqpoint{0.971455in}{1.980337in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.003967in}{1.985559in}}% -\pgfpathlineto{\pgfqpoint{1.003967in}{1.988675in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.036480in}{1.991755in}}% -\pgfpathlineto{\pgfqpoint{1.036480in}{1.994896in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.068992in}{1.995806in}}% -\pgfpathlineto{\pgfqpoint{1.068992in}{1.998926in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.101504in}{2.003435in}}% -\pgfpathlineto{\pgfqpoint{1.101504in}{2.006461in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.134017in}{2.017560in}}% -\pgfpathlineto{\pgfqpoint{1.134017in}{2.020987in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.166529in}{2.014645in}}% -\pgfpathlineto{\pgfqpoint{1.166529in}{2.017844in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.199042in}{2.016159in}}% -\pgfpathlineto{\pgfqpoint{1.199042in}{2.019357in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.231554in}{2.024798in}}% -\pgfpathlineto{\pgfqpoint{1.231554in}{2.027982in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.264067in}{2.029705in}}% -\pgfpathlineto{\pgfqpoint{1.264067in}{2.032958in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.296579in}{2.029626in}}% -\pgfpathlineto{\pgfqpoint{1.296579in}{2.032560in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.329091in}{2.042976in}}% -\pgfpathlineto{\pgfqpoint{1.329091in}{2.046031in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.361604in}{2.044356in}}% -\pgfpathlineto{\pgfqpoint{1.361604in}{2.047434in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.394116in}{2.044176in}}% -\pgfpathlineto{\pgfqpoint{1.394116in}{2.047143in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.426629in}{2.053699in}}% -\pgfpathlineto{\pgfqpoint{1.426629in}{2.056755in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.459141in}{2.052903in}}% -\pgfpathlineto{\pgfqpoint{1.459141in}{2.055728in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetrectcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.483769in}{1.801003in}}% -\pgfpathlineto{\pgfqpoint{0.516281in}{1.857919in}}% -\pgfpathlineto{\pgfqpoint{0.548793in}{1.876636in}}% -\pgfpathlineto{\pgfqpoint{0.581306in}{1.886646in}}% -\pgfpathlineto{\pgfqpoint{0.613818in}{1.900795in}}% -\pgfpathlineto{\pgfqpoint{0.646331in}{1.910116in}}% -\pgfpathlineto{\pgfqpoint{0.678843in}{1.923301in}}% -\pgfpathlineto{\pgfqpoint{0.711356in}{1.925288in}}% -\pgfpathlineto{\pgfqpoint{0.743868in}{1.935232in}}% -\pgfpathlineto{\pgfqpoint{0.776380in}{1.944176in}}% -\pgfpathlineto{\pgfqpoint{0.808893in}{1.952657in}}% -\pgfpathlineto{\pgfqpoint{0.841405in}{1.954976in}}% -\pgfpathlineto{\pgfqpoint{0.873918in}{1.962551in}}% -\pgfpathlineto{\pgfqpoint{0.906430in}{1.974159in}}% -\pgfpathlineto{\pgfqpoint{0.938942in}{1.976568in}}% -\pgfpathlineto{\pgfqpoint{0.971455in}{1.978668in}}% -\pgfpathlineto{\pgfqpoint{1.003967in}{1.987117in}}% -\pgfpathlineto{\pgfqpoint{1.036480in}{1.993326in}}% -\pgfpathlineto{\pgfqpoint{1.068992in}{1.997366in}}% -\pgfpathlineto{\pgfqpoint{1.101504in}{2.004948in}}% -\pgfpathlineto{\pgfqpoint{1.134017in}{2.019274in}}% -\pgfpathlineto{\pgfqpoint{1.166529in}{2.016245in}}% -\pgfpathlineto{\pgfqpoint{1.199042in}{2.017758in}}% -\pgfpathlineto{\pgfqpoint{1.231554in}{2.026390in}}% -\pgfpathlineto{\pgfqpoint{1.264067in}{2.031332in}}% -\pgfpathlineto{\pgfqpoint{1.296579in}{2.031093in}}% -\pgfpathlineto{\pgfqpoint{1.329091in}{2.044504in}}% -\pgfpathlineto{\pgfqpoint{1.361604in}{2.045895in}}% -\pgfpathlineto{\pgfqpoint{1.394116in}{2.045660in}}% -\pgfpathlineto{\pgfqpoint{1.426629in}{2.055227in}}% -\pgfpathlineto{\pgfqpoint{1.459141in}{2.054316in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{0.435000in}{2.790000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.507910in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{2.790000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{1.772096in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{2.790000in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{2.790000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.220418in,y=2.820537in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10^{-6}\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.971455in,y=2.873333in,,base]{\sffamily\fontsize{9.000000}{10.800000}\selectfont no act. \& 1 layer}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetmiterjoin% -\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.000000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetstrokeopacity{0.000000}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{2.790000in}}% -\pgfpathlineto{\pgfqpoint{1.682090in}{2.790000in}}% -\pgfpathclose% -\pgfusepath{fill}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.730859in}{2.053857in}}% -\pgfpathlineto{\pgfqpoint{1.730859in}{2.056824in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.839234in}{2.183970in}}% -\pgfpathlineto{\pgfqpoint{1.839234in}{2.187389in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.947608in}{2.261388in}}% -\pgfpathlineto{\pgfqpoint{1.947608in}{2.264898in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.055983in}{2.346160in}}% -\pgfpathlineto{\pgfqpoint{2.055983in}{2.350542in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.164358in}{2.412257in}}% -\pgfpathlineto{\pgfqpoint{2.164358in}{2.417191in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.272733in}{2.479400in}}% -\pgfpathlineto{\pgfqpoint{2.272733in}{2.484942in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.381107in}{2.538728in}}% -\pgfpathlineto{\pgfqpoint{2.381107in}{2.545321in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.489482in}{2.596869in}}% -\pgfpathlineto{\pgfqpoint{2.489482in}{2.604488in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.597857in}{2.651728in}}% -\pgfpathlineto{\pgfqpoint{2.597857in}{2.660350in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.706231in}{2.705006in}}% -\pgfpathlineto{\pgfqpoint{2.706231in}{2.714816in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{1.772096in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetrectcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.730859in}{2.055341in}}% -\pgfpathlineto{\pgfqpoint{1.839234in}{2.185679in}}% -\pgfpathlineto{\pgfqpoint{1.947608in}{2.263143in}}% -\pgfpathlineto{\pgfqpoint{2.055983in}{2.348351in}}% -\pgfpathlineto{\pgfqpoint{2.164358in}{2.414724in}}% -\pgfpathlineto{\pgfqpoint{2.272733in}{2.482171in}}% -\pgfpathlineto{\pgfqpoint{2.381107in}{2.542025in}}% -\pgfpathlineto{\pgfqpoint{2.489482in}{2.600678in}}% -\pgfpathlineto{\pgfqpoint{2.597857in}{2.656039in}}% -\pgfpathlineto{\pgfqpoint{2.706231in}{2.709911in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{1.682090in}{2.790000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.755000in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{2.790000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{1.772096in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{1.772096in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{2.790000in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{2.790000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=2.218545in,y=2.873333in,,base]{\sffamily\fontsize{9.000000}{10.800000}\selectfont no act. \& res. of 30}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetmiterjoin% -\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.000000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetstrokeopacity{0.000000}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{1.434904in}}% -\pgfpathlineto{\pgfqpoint{0.435000in}{1.434904in}}% -\pgfpathclose% -\pgfusepath{fill}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.451256in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.451256in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.776380in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.776380in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{1.101504in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=1.101504in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 20\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{1.426629in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=1.426629in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 30\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.971455in,y=0.129809in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont resolution}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.268333in,y=0.364238in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{0.620581in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=0.567819in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0.1\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{0.824162in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=0.771400in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0.2\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{1.027742in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=0.974981in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0.3\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{1.231323in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=1.178561in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0.4\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{-0.048611in}{0.000000in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{-0.048611in}{0.000000in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{0.435000in}{1.434904in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.160308in,y=1.382142in,left,base]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 0.5\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.104753in,y=0.925952in,,bottom,rotate=90.000000]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle \Delta\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.483769in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{0.483769in}{0.417000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.516281in}{1.087926in}}% -\pgfpathlineto{\pgfqpoint{0.516281in}{1.240598in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.548793in}{1.152462in}}% -\pgfpathlineto{\pgfqpoint{0.548793in}{1.259013in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.581306in}{1.173973in}}% -\pgfpathlineto{\pgfqpoint{0.581306in}{1.253632in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.613818in}{1.182815in}}% -\pgfpathlineto{\pgfqpoint{0.613818in}{1.243840in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.646331in}{1.193583in}}% -\pgfpathlineto{\pgfqpoint{0.646331in}{1.246114in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.678843in}{1.196350in}}% -\pgfpathlineto{\pgfqpoint{0.678843in}{1.240511in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.711356in}{1.203161in}}% -\pgfpathlineto{\pgfqpoint{0.711356in}{1.239034in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.743868in}{1.200680in}}% -\pgfpathlineto{\pgfqpoint{0.743868in}{1.237456in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.776380in}{1.204414in}}% -\pgfpathlineto{\pgfqpoint{0.776380in}{1.236464in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.808893in}{1.206039in}}% -\pgfpathlineto{\pgfqpoint{0.808893in}{1.235865in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.841405in}{1.205169in}}% -\pgfpathlineto{\pgfqpoint{0.841405in}{1.235873in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.873918in}{1.207171in}}% -\pgfpathlineto{\pgfqpoint{0.873918in}{1.234032in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.906430in}{1.206792in}}% -\pgfpathlineto{\pgfqpoint{0.906430in}{1.233639in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.938942in}{1.207428in}}% -\pgfpathlineto{\pgfqpoint{0.938942in}{1.233292in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.971455in}{1.208018in}}% -\pgfpathlineto{\pgfqpoint{0.971455in}{1.231842in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.003967in}{1.207893in}}% -\pgfpathlineto{\pgfqpoint{1.003967in}{1.232489in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.036480in}{1.207059in}}% -\pgfpathlineto{\pgfqpoint{1.036480in}{1.232090in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.068992in}{1.207845in}}% -\pgfpathlineto{\pgfqpoint{1.068992in}{1.233249in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.101504in}{1.208518in}}% -\pgfpathlineto{\pgfqpoint{1.101504in}{1.230402in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.134017in}{1.208856in}}% -\pgfpathlineto{\pgfqpoint{1.134017in}{1.231519in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.166529in}{1.209370in}}% -\pgfpathlineto{\pgfqpoint{1.166529in}{1.232070in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.199042in}{1.207976in}}% -\pgfpathlineto{\pgfqpoint{1.199042in}{1.230030in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.231554in}{1.207767in}}% -\pgfpathlineto{\pgfqpoint{1.231554in}{1.231467in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.264067in}{1.209510in}}% -\pgfpathlineto{\pgfqpoint{1.264067in}{1.230919in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.296579in}{1.208852in}}% -\pgfpathlineto{\pgfqpoint{1.296579in}{1.231592in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.329091in}{1.208693in}}% -\pgfpathlineto{\pgfqpoint{1.329091in}{1.230429in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.361604in}{1.209709in}}% -\pgfpathlineto{\pgfqpoint{1.361604in}{1.230605in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.394116in}{1.209075in}}% -\pgfpathlineto{\pgfqpoint{1.394116in}{1.229295in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.426629in}{1.209213in}}% -\pgfpathlineto{\pgfqpoint{1.426629in}{1.230489in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.459141in}{1.209447in}}% -\pgfpathlineto{\pgfqpoint{1.459141in}{1.229850in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{0.435000in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetrectcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.483769in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{0.516281in}{1.164262in}}% -\pgfpathlineto{\pgfqpoint{0.548793in}{1.205738in}}% -\pgfpathlineto{\pgfqpoint{0.581306in}{1.213802in}}% -\pgfpathlineto{\pgfqpoint{0.613818in}{1.213327in}}% -\pgfpathlineto{\pgfqpoint{0.646331in}{1.219848in}}% -\pgfpathlineto{\pgfqpoint{0.678843in}{1.218430in}}% -\pgfpathlineto{\pgfqpoint{0.711356in}{1.221098in}}% -\pgfpathlineto{\pgfqpoint{0.743868in}{1.219068in}}% -\pgfpathlineto{\pgfqpoint{0.776380in}{1.220439in}}% -\pgfpathlineto{\pgfqpoint{0.808893in}{1.220952in}}% -\pgfpathlineto{\pgfqpoint{0.841405in}{1.220521in}}% -\pgfpathlineto{\pgfqpoint{0.873918in}{1.220602in}}% -\pgfpathlineto{\pgfqpoint{0.906430in}{1.220215in}}% -\pgfpathlineto{\pgfqpoint{0.938942in}{1.220360in}}% -\pgfpathlineto{\pgfqpoint{0.971455in}{1.219930in}}% -\pgfpathlineto{\pgfqpoint{1.003967in}{1.220191in}}% -\pgfpathlineto{\pgfqpoint{1.036480in}{1.219575in}}% -\pgfpathlineto{\pgfqpoint{1.068992in}{1.220547in}}% -\pgfpathlineto{\pgfqpoint{1.101504in}{1.219460in}}% -\pgfpathlineto{\pgfqpoint{1.134017in}{1.220187in}}% -\pgfpathlineto{\pgfqpoint{1.166529in}{1.220720in}}% -\pgfpathlineto{\pgfqpoint{1.199042in}{1.219003in}}% -\pgfpathlineto{\pgfqpoint{1.231554in}{1.219617in}}% -\pgfpathlineto{\pgfqpoint{1.264067in}{1.220215in}}% -\pgfpathlineto{\pgfqpoint{1.296579in}{1.220222in}}% -\pgfpathlineto{\pgfqpoint{1.329091in}{1.219561in}}% -\pgfpathlineto{\pgfqpoint{1.361604in}{1.220157in}}% -\pgfpathlineto{\pgfqpoint{1.394116in}{1.219185in}}% -\pgfpathlineto{\pgfqpoint{1.426629in}{1.219851in}}% -\pgfpathlineto{\pgfqpoint{1.459141in}{1.219648in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{0.435000in}{1.434904in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.507910in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{1.434904in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{0.417000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{0.435000in}{1.434904in}}% -\pgfpathlineto{\pgfqpoint{1.507910in}{1.434904in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=0.971455in,y=1.518237in,,base]{\sffamily\fontsize{9.000000}{10.800000}\selectfont ReLU \& 1 layer}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetmiterjoin% -\definecolor{currentfill}{rgb}{1.000000,1.000000,1.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.000000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetstrokeopacity{0.000000}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{1.434904in}}% -\pgfpathlineto{\pgfqpoint{1.682090in}{1.434904in}}% -\pgfpathclose% -\pgfusepath{fill}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{1.730859in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=1.730859in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 1\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{2.164358in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=2.164358in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 5\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\definecolor{currentfill}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetfillcolor{currentfill}% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfsys@defobject{currentmarker}{\pgfqpoint{0.000000in}{-0.048611in}}{\pgfqpoint{0.000000in}{0.000000in}}{% -\pgfpathmoveto{\pgfqpoint{0.000000in}{0.000000in}}% -\pgfpathlineto{\pgfqpoint{0.000000in}{-0.048611in}}% -\pgfusepath{stroke,fill}% -}% -\begin{pgfscope}% -\pgfsys@transformshift{2.706231in}{0.417000in}% -\pgfsys@useobject{currentmarker}{}% -\end{pgfscope}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=2.706231in,y=0.319778in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont \(\displaystyle 10\)}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=2.218545in,y=0.129809in,,top]{\sffamily\fontsize{10.000000}{12.000000}\selectfont layers}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.730859in}{1.208853in}}% -\pgfpathlineto{\pgfqpoint{1.730859in}{1.231038in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.839234in}{1.039422in}}% -\pgfpathlineto{\pgfqpoint{1.839234in}{1.231627in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.947608in}{0.929244in}}% -\pgfpathlineto{\pgfqpoint{1.947608in}{1.185272in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.055983in}{0.876266in}}% -\pgfpathlineto{\pgfqpoint{2.055983in}{1.212231in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.164358in}{0.851176in}}% -\pgfpathlineto{\pgfqpoint{2.164358in}{1.213174in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.272733in}{0.835044in}}% -\pgfpathlineto{\pgfqpoint{2.272733in}{1.254822in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.381107in}{0.815877in}}% -\pgfpathlineto{\pgfqpoint{2.381107in}{1.261733in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.489482in}{0.819663in}}% -\pgfpathlineto{\pgfqpoint{2.489482in}{1.277766in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.597857in}{0.790004in}}% -\pgfpathlineto{\pgfqpoint{2.597857in}{1.278259in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetbuttcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.706231in}{0.779944in}}% -\pgfpathlineto{\pgfqpoint{2.706231in}{1.327897in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfpathrectangle{\pgfqpoint{1.682090in}{0.417000in}}{\pgfqpoint{1.072910in}{1.017904in}} % -\pgfusepath{clip}% -\pgfsetrectcap% -\pgfsetroundjoin% -\pgfsetlinewidth{1.505625pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.730859in}{1.219946in}}% -\pgfpathlineto{\pgfqpoint{1.839234in}{1.135524in}}% -\pgfpathlineto{\pgfqpoint{1.947608in}{1.057258in}}% -\pgfpathlineto{\pgfqpoint{2.055983in}{1.044249in}}% -\pgfpathlineto{\pgfqpoint{2.164358in}{1.032175in}}% -\pgfpathlineto{\pgfqpoint{2.272733in}{1.044933in}}% -\pgfpathlineto{\pgfqpoint{2.381107in}{1.038805in}}% -\pgfpathlineto{\pgfqpoint{2.489482in}{1.048714in}}% -\pgfpathlineto{\pgfqpoint{2.597857in}{1.034131in}}% -\pgfpathlineto{\pgfqpoint{2.706231in}{1.053920in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{1.682090in}{1.434904in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{2.755000in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{1.434904in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{0.417000in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{0.417000in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgfsetrectcap% -\pgfsetmiterjoin% -\pgfsetlinewidth{0.803000pt}% -\definecolor{currentstroke}{rgb}{0.000000,0.000000,0.000000}% -\pgfsetstrokecolor{currentstroke}% -\pgfsetdash{}{0pt}% -\pgfpathmoveto{\pgfqpoint{1.682090in}{1.434904in}}% -\pgfpathlineto{\pgfqpoint{2.755000in}{1.434904in}}% -\pgfusepath{stroke}% -\end{pgfscope}% -\begin{pgfscope}% -\pgftext[x=2.218545in,y=1.518237in,,base]{\sffamily\fontsize{9.000000}{10.800000}\selectfont ReLU \& res. of 30}% -\end{pgfscope}% -\end{pgfpicture}% -\makeatother% -\endgroup% diff --git a/docs/cohen_et_al_2018/fancyhdr.sty b/docs/cohen_et_al_2018/fancyhdr.sty deleted file mode 100644 index 5a4d897..0000000 --- a/docs/cohen_et_al_2018/fancyhdr.sty +++ /dev/null @@ -1,485 +0,0 @@ -% fancyhdr.sty version 3.2 -% Fancy headers and footers for LaTeX. -% Piet van Oostrum, -% Dept of Computer and Information Sciences, University of Utrecht, -% Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands -% Telephone: +31 30 2532180. Email: piet@cs.uu.nl -% ======================================================================== -% LICENCE: -% This file may be distributed under the terms of the LaTeX Project Public -% License, as described in lppl.txt in the base LaTeX distribution. -% Either version 1 or, at your option, any later version. -% ======================================================================== -% MODIFICATION HISTORY: -% Sep 16, 1994 -% version 1.4: Correction for use with \reversemargin -% Sep 29, 1994: -% version 1.5: Added the \iftopfloat, \ifbotfloat and \iffloatpage commands -% Oct 4, 1994: -% version 1.6: Reset single spacing in headers/footers for use with -% setspace.sty or doublespace.sty -% Oct 4, 1994: -% version 1.7: changed \let\@mkboth\markboth to -% \def\@mkboth{\protect\markboth} to make it more robust -% Dec 5, 1994: -% version 1.8: corrections for amsbook/amsart: define \@chapapp and (more -% importantly) use the \chapter/sectionmark definitions from ps@headings if -% they exist (which should be true for all standard classes). -% May 31, 1995: -% version 1.9: The proposed \renewcommand{\headrulewidth}{\iffloatpage... -% construction in the doc did not work properly with the fancyplain style. -% June 1, 1995: -% version 1.91: The definition of \@mkboth wasn't restored on subsequent -% \pagestyle{fancy}'s. -% June 1, 1995: -% version 1.92: The sequence \pagestyle{fancyplain} \pagestyle{plain} -% \pagestyle{fancy} would erroneously select the plain version. -% June 1, 1995: -% version 1.93: \fancypagestyle command added. -% Dec 11, 1995: -% version 1.94: suggested by Conrad Hughes -% CJCH, Dec 11, 1995: added \footruleskip to allow control over footrule -% position (old hardcoded value of .3\normalbaselineskip is far too high -% when used with very small footer fonts). -% Jan 31, 1996: -% version 1.95: call \@normalsize in the reset code if that is defined, -% otherwise \normalsize. -% this is to solve a problem with ucthesis.cls, as this doesn't -% define \@currsize. Unfortunately for latex209 calling \normalsize doesn't -% work as this is optimized to do very little, so there \@normalsize should -% be called. Hopefully this code works for all versions of LaTeX known to -% mankind. -% April 25, 1996: -% version 1.96: initialize \headwidth to a magic (negative) value to catch -% most common cases that people change it before calling \pagestyle{fancy}. -% Note it can't be initialized when reading in this file, because -% \textwidth could be changed afterwards. This is quite probable. -% We also switch to \MakeUppercase rather than \uppercase and introduce a -% \nouppercase command for use in headers. and footers. -% May 3, 1996: -% version 1.97: Two changes: -% 1. Undo the change in version 1.8 (using the pagestyle{headings} defaults -% for the chapter and section marks. The current version of amsbook and -% amsart classes don't seem to need them anymore. Moreover the standard -% latex classes don't use \markboth if twoside isn't selected, and this is -% confusing as \leftmark doesn't work as expected. -% 2. include a call to \ps@empty in ps@@fancy. This is to solve a problem -% in the amsbook and amsart classes, that make global changes to \topskip, -% which are reset in \ps@empty. Hopefully this doesn't break other things. -% May 7, 1996: -% version 1.98: -% Added % after the line \def\nouppercase -% May 7, 1996: -% version 1.99: This is the alpha version of fancyhdr 2.0 -% Introduced the new commands \fancyhead, \fancyfoot, and \fancyhf. -% Changed \headrulewidth, \footrulewidth, \footruleskip to -% macros rather than length parameters, In this way they can be -% conditionalized and they don't consume length registers. There is no need -% to have them as length registers unless you want to do calculations with -% them, which is unlikely. Note that this may make some uses of them -% incompatible (i.e. if you have a file that uses \setlength or \xxxx=) -% May 10, 1996: -% version 1.99a: -% Added a few more % signs -% May 10, 1996: -% version 1.99b: -% Changed the syntax of \f@nfor to be resistent to catcode changes of := -% Removed the [1] from the defs of \lhead etc. because the parameter is -% consumed by the \@[xy]lhead etc. macros. -% June 24, 1997: -% version 1.99c: -% corrected \nouppercase to also include the protected form of \MakeUppercase -% \global added to manipulation of \headwidth. -% \iffootnote command added. -% Some comments added about \@fancyhead and \@fancyfoot. -% Aug 24, 1998 -% version 1.99d -% Changed the default \ps@empty to \ps@@empty in order to allow -% \fancypagestyle{empty} redefinition. -% Oct 11, 2000 -% version 2.0 -% Added LPPL license clause. -% -% A check for \headheight is added. An errormessage is given (once) if the -% header is too large. Empty headers don't generate the error even if -% \headheight is very small or even 0pt. -% Warning added for the use of 'E' option when twoside option is not used. -% In this case the 'E' fields will never be used. -% -% Mar 10, 2002 -% version 2.1beta -% New command: \fancyhfoffset[place]{length} -% defines offsets to be applied to the header/footer to let it stick into -% the margins (if length > 0). -% place is like in fancyhead, except that only E,O,L,R can be used. -% This replaces the old calculation based on \headwidth and the marginpar -% area. -% \headwidth will be dynamically calculated in the headers/footers when -% this is used. -% -% Mar 26, 2002 -% version 2.1beta2 -% \fancyhfoffset now also takes h,f as possible letters in the argument to -% allow the header and footer widths to be different. -% New commands \fancyheadoffset and \fancyfootoffset added comparable to -% \fancyhead and \fancyfoot. -% Errormessages and warnings have been made more informative. -% -% Dec 9, 2002 -% version 2.1 -% The defaults for \footrulewidth, \plainheadrulewidth and -% \plainfootrulewidth are changed from \z@skip to 0pt. In this way when -% someone inadvertantly uses \setlength to change any of these, the value -% of \z@skip will not be changed, rather an errormessage will be given. - -% March 3, 2004 -% Release of version 3.0 - -% Oct 7, 2004 -% version 3.1 -% Added '\endlinechar=13' to \fancy@reset to prevent problems with -% includegraphics in header when verbatiminput is active. - -% March 22, 2005 -% version 3.2 -% reset \everypar (the real one) in \fancy@reset because spanish.ldf does -% strange things with \everypar between << and >>. - -\def\ifancy@mpty#1{\def\temp@a{#1}\ifx\temp@a\@empty} - -\def\fancy@def#1#2{\ifancy@mpty{#2}\fancy@gbl\def#1{\leavevmode}\else - \fancy@gbl\def#1{#2\strut}\fi} - -\let\fancy@gbl\global - -\def\@fancyerrmsg#1{% - \ifx\PackageError\undefined - \errmessage{#1}\else - \PackageError{Fancyhdr}{#1}{}\fi} -\def\@fancywarning#1{% - \ifx\PackageWarning\undefined - \errmessage{#1}\else - \PackageWarning{Fancyhdr}{#1}{}\fi} - -% Usage: \@forc \var{charstring}{command to be executed for each char} -% This is similar to LaTeX's \@tfor, but expands the charstring. - -\def\@forc#1#2#3{\expandafter\f@rc\expandafter#1\expandafter{#2}{#3}} -\def\f@rc#1#2#3{\def\temp@ty{#2}\ifx\@empty\temp@ty\else - \f@@rc#1#2\f@@rc{#3}\fi} -\def\f@@rc#1#2#3\f@@rc#4{\def#1{#2}#4\f@rc#1{#3}{#4}} - -% Usage: \f@nfor\name:=list\do{body} -% Like LaTeX's \@for but an empty list is treated as a list with an empty -% element - -\newcommand{\f@nfor}[3]{\edef\@fortmp{#2}% - \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}} - -% Usage: \def@ult \cs{defaults}{argument} -% sets \cs to the characters from defaults appearing in argument -% or defaults if it would be empty. All characters are lowercased. - -\newcommand\def@ult[3]{% - \edef\temp@a{\lowercase{\edef\noexpand\temp@a{#3}}}\temp@a - \def#1{}% - \@forc\tmpf@ra{#2}% - {\expandafter\if@in\tmpf@ra\temp@a{\edef#1{#1\tmpf@ra}}{}}% - \ifx\@empty#1\def#1{#2}\fi} -% -% \if@in -% -\newcommand{\if@in}[4]{% - \edef\temp@a{#2}\def\temp@b##1#1##2\temp@b{\def\temp@b{##1}}% - \expandafter\temp@b#2#1\temp@b\ifx\temp@a\temp@b #4\else #3\fi} - -\newcommand{\fancyhead}{\@ifnextchar[{\f@ncyhf\fancyhead h}% - {\f@ncyhf\fancyhead h[]}} -\newcommand{\fancyfoot}{\@ifnextchar[{\f@ncyhf\fancyfoot f}% - {\f@ncyhf\fancyfoot f[]}} -\newcommand{\fancyhf}{\@ifnextchar[{\f@ncyhf\fancyhf{}}% - {\f@ncyhf\fancyhf{}[]}} - -% New commands for offsets added - -\newcommand{\fancyheadoffset}{\@ifnextchar[{\f@ncyhfoffs\fancyheadoffset h}% - {\f@ncyhfoffs\fancyheadoffset h[]}} -\newcommand{\fancyfootoffset}{\@ifnextchar[{\f@ncyhfoffs\fancyfootoffset f}% - {\f@ncyhfoffs\fancyfootoffset f[]}} -\newcommand{\fancyhfoffset}{\@ifnextchar[{\f@ncyhfoffs\fancyhfoffset{}}% - {\f@ncyhfoffs\fancyhfoffset{}[]}} - -% The header and footer fields are stored in command sequences with -% names of the form: \f@ncy with for [eo], from [lcr] -% and from [hf]. - -\def\f@ncyhf#1#2[#3]#4{% - \def\temp@c{}% - \@forc\tmpf@ra{#3}% - {\expandafter\if@in\tmpf@ra{eolcrhf,EOLCRHF}% - {}{\edef\temp@c{\temp@c\tmpf@ra}}}% - \ifx\@empty\temp@c\else - \@fancyerrmsg{Illegal char `\temp@c' in \string#1 argument: - [#3]}% - \fi - \f@nfor\temp@c{#3}% - {\def@ult\f@@@eo{eo}\temp@c - \if@twoside\else - \if\f@@@eo e\@fancywarning - {\string#1's `E' option without twoside option is useless}\fi\fi - \def@ult\f@@@lcr{lcr}\temp@c - \def@ult\f@@@hf{hf}{#2\temp@c}% - \@forc\f@@eo\f@@@eo - {\@forc\f@@lcr\f@@@lcr - {\@forc\f@@hf\f@@@hf - {\expandafter\fancy@def\csname - f@ncy\f@@eo\f@@lcr\f@@hf\endcsname - {#4}}}}}} - -\def\f@ncyhfoffs#1#2[#3]#4{% - \def\temp@c{}% - \@forc\tmpf@ra{#3}% - {\expandafter\if@in\tmpf@ra{eolrhf,EOLRHF}% - {}{\edef\temp@c{\temp@c\tmpf@ra}}}% - \ifx\@empty\temp@c\else - \@fancyerrmsg{Illegal char `\temp@c' in \string#1 argument: - [#3]}% - \fi - \f@nfor\temp@c{#3}% - {\def@ult\f@@@eo{eo}\temp@c - \if@twoside\else - \if\f@@@eo e\@fancywarning - {\string#1's `E' option without twoside option is useless}\fi\fi - \def@ult\f@@@lcr{lr}\temp@c - \def@ult\f@@@hf{hf}{#2\temp@c}% - \@forc\f@@eo\f@@@eo - {\@forc\f@@lcr\f@@@lcr - {\@forc\f@@hf\f@@@hf - {\expandafter\setlength\csname - f@ncyO@\f@@eo\f@@lcr\f@@hf\endcsname - {#4}}}}}% - \fancy@setoffs} - -% Fancyheadings version 1 commands. These are more or less deprecated, -% but they continue to work. - -\newcommand{\lhead}{\@ifnextchar[{\@xlhead}{\@ylhead}} -\def\@xlhead[#1]#2{\fancy@def\f@ncyelh{#1}\fancy@def\f@ncyolh{#2}} -\def\@ylhead#1{\fancy@def\f@ncyelh{#1}\fancy@def\f@ncyolh{#1}} - -\newcommand{\chead}{\@ifnextchar[{\@xchead}{\@ychead}} -\def\@xchead[#1]#2{\fancy@def\f@ncyech{#1}\fancy@def\f@ncyoch{#2}} -\def\@ychead#1{\fancy@def\f@ncyech{#1}\fancy@def\f@ncyoch{#1}} - -\newcommand{\rhead}{\@ifnextchar[{\@xrhead}{\@yrhead}} -\def\@xrhead[#1]#2{\fancy@def\f@ncyerh{#1}\fancy@def\f@ncyorh{#2}} -\def\@yrhead#1{\fancy@def\f@ncyerh{#1}\fancy@def\f@ncyorh{#1}} - -\newcommand{\lfoot}{\@ifnextchar[{\@xlfoot}{\@ylfoot}} -\def\@xlfoot[#1]#2{\fancy@def\f@ncyelf{#1}\fancy@def\f@ncyolf{#2}} -\def\@ylfoot#1{\fancy@def\f@ncyelf{#1}\fancy@def\f@ncyolf{#1}} - -\newcommand{\cfoot}{\@ifnextchar[{\@xcfoot}{\@ycfoot}} -\def\@xcfoot[#1]#2{\fancy@def\f@ncyecf{#1}\fancy@def\f@ncyocf{#2}} -\def\@ycfoot#1{\fancy@def\f@ncyecf{#1}\fancy@def\f@ncyocf{#1}} - -\newcommand{\rfoot}{\@ifnextchar[{\@xrfoot}{\@yrfoot}} -\def\@xrfoot[#1]#2{\fancy@def\f@ncyerf{#1}\fancy@def\f@ncyorf{#2}} -\def\@yrfoot#1{\fancy@def\f@ncyerf{#1}\fancy@def\f@ncyorf{#1}} - -\newlength{\fancy@headwidth} -\let\headwidth\fancy@headwidth -\newlength{\f@ncyO@elh} -\newlength{\f@ncyO@erh} -\newlength{\f@ncyO@olh} -\newlength{\f@ncyO@orh} -\newlength{\f@ncyO@elf} -\newlength{\f@ncyO@erf} -\newlength{\f@ncyO@olf} -\newlength{\f@ncyO@orf} -\newcommand{\headrulewidth}{0.4pt} -\newcommand{\footrulewidth}{0pt} -\newcommand{\footruleskip}{.3\normalbaselineskip} - -% Fancyplain stuff shouldn't be used anymore (rather -% \fancypagestyle{plain} should be used), but it must be present for -% compatibility reasons. - -\newcommand{\plainheadrulewidth}{0pt} -\newcommand{\plainfootrulewidth}{0pt} -\newif\if@fancyplain \@fancyplainfalse -\def\fancyplain#1#2{\if@fancyplain#1\else#2\fi} - -\headwidth=-123456789sp %magic constant - -% Command to reset various things in the headers: -% a.o. single spacing (taken from setspace.sty) -% and the catcode of ^^M (so that epsf files in the header work if a -% verbatim crosses a page boundary) -% It also defines a \nouppercase command that disables \uppercase and -% \Makeuppercase. It can only be used in the headers and footers. -\let\fnch@everypar\everypar% save real \everypar because of spanish.ldf -\def\fancy@reset{\fnch@everypar{}\restorecr\endlinechar=13 - \def\baselinestretch{1}% - \def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax - \expandafter\let\csname MakeUppercase \endcsname\relax##1}}% - \ifx\undefined\@newbaseline% NFSS not present; 2.09 or 2e - \ifx\@normalsize\undefined \normalsize % for ucthesis.cls - \else \@normalsize \fi - \else% NFSS (2.09) present - \@newbaseline% - \fi} - -% Initialization of the head and foot text. - -% The default values still contain \fancyplain for compatibility. -\fancyhf{} % clear all -% lefthead empty on ``plain'' pages, \rightmark on even, \leftmark on odd pages -% evenhead empty on ``plain'' pages, \leftmark on even, \rightmark on odd pages -\if@twoside - \fancyhead[el,or]{\fancyplain{}{\sl\rightmark}} - \fancyhead[er,ol]{\fancyplain{}{\sl\leftmark}} -\else - \fancyhead[l]{\fancyplain{}{\sl\rightmark}} - \fancyhead[r]{\fancyplain{}{\sl\leftmark}} -\fi -\fancyfoot[c]{\rm\thepage} % page number - -% Use box 0 as a temp box and dimen 0 as temp dimen. -% This can be done, because this code will always -% be used inside another box, and therefore the changes are local. - -\def\@fancyvbox#1#2{\setbox0\vbox{#2}\ifdim\ht0>#1\@fancywarning - {\string#1 is too small (\the#1): ^^J Make it at least \the\ht0.^^J - We now make it that large for the rest of the document.^^J - This may cause the page layout to be inconsistent, however\@gobble}% - \dimen0=#1\global\setlength{#1}{\ht0}\ht0=\dimen0\fi - \box0} - -% Put together a header or footer given the left, center and -% right text, fillers at left and right and a rule. -% The \lap commands put the text into an hbox of zero size, -% so overlapping text does not generate an errormessage. -% These macros have 5 parameters: -% 1. LEFTSIDE BEARING % This determines at which side the header will stick -% out. When \fancyhfoffset is used this calculates \headwidth, otherwise -% it is \hss or \relax (after expansion). -% 2. \f@ncyolh, \f@ncyelh, \f@ncyolf or \f@ncyelf. This is the left component. -% 3. \f@ncyoch, \f@ncyech, \f@ncyocf or \f@ncyecf. This is the middle comp. -% 4. \f@ncyorh, \f@ncyerh, \f@ncyorf or \f@ncyerf. This is the right component. -% 5. RIGHTSIDE BEARING. This is always \relax or \hss (after expansion). - -\def\@fancyhead#1#2#3#4#5{#1\hbox to\headwidth{\fancy@reset - \@fancyvbox\headheight{\hbox - {\rlap{\parbox[b]{\headwidth}{\raggedright#2}}\hfill - \parbox[b]{\headwidth}{\centering#3}\hfill - \llap{\parbox[b]{\headwidth}{\raggedleft#4}}}\headrule}}#5} - -\def\@fancyfoot#1#2#3#4#5{#1\hbox to\headwidth{\fancy@reset - \@fancyvbox\footskip{\footrule - \hbox{\rlap{\parbox[t]{\headwidth}{\raggedright#2}}\hfill - \parbox[t]{\headwidth}{\centering#3}\hfill - \llap{\parbox[t]{\headwidth}{\raggedleft#4}}}}}#5} - -\def\headrule{{\if@fancyplain\let\headrulewidth\plainheadrulewidth\fi - \hrule\@height\headrulewidth\@width\headwidth \vskip-\headrulewidth}} - -\def\footrule{{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi - \vskip-\footruleskip\vskip-\footrulewidth - \hrule\@width\headwidth\@height\footrulewidth\vskip\footruleskip}} - -\def\ps@fancy{% -\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}%for amsbook -% -% Define \MakeUppercase for old LaTeXen. -% Note: we used \def rather than \let, so that \let\uppercase\relax (from -% the version 1 documentation) will still work. -% -\@ifundefined{MakeUppercase}{\def\MakeUppercase{\uppercase}}{}% -\@ifundefined{chapter}{\def\sectionmark##1{\markboth -{\MakeUppercase{\ifnum \c@secnumdepth>\z@ - \thesection\hskip 1em\relax \fi ##1}}{}}% -\def\subsectionmark##1{\markright {\ifnum \c@secnumdepth >\@ne - \thesubsection\hskip 1em\relax \fi ##1}}}% -{\def\chaptermark##1{\markboth {\MakeUppercase{\ifnum \c@secnumdepth>\m@ne - \@chapapp\ \thechapter. \ \fi ##1}}{}}% -\def\sectionmark##1{\markright{\MakeUppercase{\ifnum \c@secnumdepth >\z@ - \thesection. \ \fi ##1}}}}% -%\csname ps@headings\endcsname % use \ps@headings defaults if they exist -\ps@@fancy -\gdef\ps@fancy{\@fancyplainfalse\ps@@fancy}% -% Initialize \headwidth if the user didn't -% -\ifdim\headwidth<0sp -% -% This catches the case that \headwidth hasn't been initialized and the -% case that the user added something to \headwidth in the expectation that -% it was initialized to \textwidth. We compensate this now. This loses if -% the user intended to multiply it by a factor. But that case is more -% likely done by saying something like \headwidth=1.2\textwidth. -% The doc says you have to change \headwidth after the first call to -% \pagestyle{fancy}. This code is just to catch the most common cases were -% that requirement is violated. -% - \global\advance\headwidth123456789sp\global\advance\headwidth\textwidth -\fi} -\def\ps@fancyplain{\ps@fancy \let\ps@plain\ps@plain@fancy} -\def\ps@plain@fancy{\@fancyplaintrue\ps@@fancy} -\let\ps@@empty\ps@empty -\def\ps@@fancy{% -\ps@@empty % This is for amsbook/amsart, which do strange things with \topskip -\def\@mkboth{\protect\markboth}% -\def\@oddhead{\@fancyhead\fancy@Oolh\f@ncyolh\f@ncyoch\f@ncyorh\fancy@Oorh}% -\def\@oddfoot{\@fancyfoot\fancy@Oolf\f@ncyolf\f@ncyocf\f@ncyorf\fancy@Oorf}% -\def\@evenhead{\@fancyhead\fancy@Oelh\f@ncyelh\f@ncyech\f@ncyerh\fancy@Oerh}% -\def\@evenfoot{\@fancyfoot\fancy@Oelf\f@ncyelf\f@ncyecf\f@ncyerf\fancy@Oerf}% -} -% Default definitions for compatibility mode: -% These cause the header/footer to take the defined \headwidth as width -% And to shift in the direction of the marginpar area - -\def\fancy@Oolh{\if@reversemargin\hss\else\relax\fi} -\def\fancy@Oorh{\if@reversemargin\relax\else\hss\fi} -\let\fancy@Oelh\fancy@Oorh -\let\fancy@Oerh\fancy@Oolh - -\let\fancy@Oolf\fancy@Oolh -\let\fancy@Oorf\fancy@Oorh -\let\fancy@Oelf\fancy@Oelh -\let\fancy@Oerf\fancy@Oerh - -% New definitions for the use of \fancyhfoffset -% These calculate the \headwidth from \textwidth and the specified offsets. - -\def\fancy@offsolh{\headwidth=\textwidth\advance\headwidth\f@ncyO@olh - \advance\headwidth\f@ncyO@orh\hskip-\f@ncyO@olh} -\def\fancy@offselh{\headwidth=\textwidth\advance\headwidth\f@ncyO@elh - \advance\headwidth\f@ncyO@erh\hskip-\f@ncyO@elh} - -\def\fancy@offsolf{\headwidth=\textwidth\advance\headwidth\f@ncyO@olf - \advance\headwidth\f@ncyO@orf\hskip-\f@ncyO@olf} -\def\fancy@offself{\headwidth=\textwidth\advance\headwidth\f@ncyO@elf - \advance\headwidth\f@ncyO@erf\hskip-\f@ncyO@elf} - -\def\fancy@setoffs{% -% Just in case \let\headwidth\textwidth was used - \fancy@gbl\let\headwidth\fancy@headwidth - \fancy@gbl\let\fancy@Oolh\fancy@offsolh - \fancy@gbl\let\fancy@Oelh\fancy@offselh - \fancy@gbl\let\fancy@Oorh\hss - \fancy@gbl\let\fancy@Oerh\hss - \fancy@gbl\let\fancy@Oolf\fancy@offsolf - \fancy@gbl\let\fancy@Oelf\fancy@offself - \fancy@gbl\let\fancy@Oorf\hss - \fancy@gbl\let\fancy@Oerf\hss} - -\newif\iffootnote -\let\latex@makecol\@makecol -\def\@makecol{\ifvoid\footins\footnotetrue\else\footnotefalse\fi -\let\topfloat\@toplist\let\botfloat\@botlist\latex@makecol} -\def\iftopfloat#1#2{\ifx\topfloat\empty #2\else #1\fi} -\def\ifbotfloat#1#2{\ifx\botfloat\empty #2\else #1\fi} -\def\iffloatpage#1#2{\if@fcolmade #1\else #2\fi} - -\newcommand{\fancypagestyle}[2]{% - \@namedef{ps@#1}{\let\fancy@gbl\relax#2\relax\ps@fancy}} diff --git a/docs/cohen_et_al_2018/iclr2018_conference.sty b/docs/cohen_et_al_2018/iclr2018_conference.sty deleted file mode 100644 index 485619b..0000000 --- a/docs/cohen_et_al_2018/iclr2018_conference.sty +++ /dev/null @@ -1,246 +0,0 @@ -%%%% ICLR Macros (LaTex) -%%%% Adapted by Hugo Larochelle from the NIPS stylefile Macros -%%%% Style File -%%%% Dec 12, 1990 Rev Aug 14, 1991; Sept, 1995; April, 1997; April, 1999; October 2014 - -% This file can be used with Latex2e whether running in main mode, or -% 2.09 compatibility mode. -% -% If using main mode, you need to include the commands -% \documentclass{article} -% \usepackage{iclr14submit_e,times} -% - -% Change the overall width of the page. If these parameters are -% changed, they will require corresponding changes in the -% maketitle section. -% -\usepackage{eso-pic} % used by \AddToShipoutPicture -\RequirePackage{fancyhdr} -\RequirePackage{natbib} - -% modification to natbib citations -\setcitestyle{authoryear,round,citesep={;},aysep={,},yysep={;}} - -\renewcommand{\topfraction}{0.95} % let figure take up nearly whole page -\renewcommand{\textfraction}{0.05} % let figure take up nearly whole page - -% Define iclrfinal, set to true if iclrfinalcopy is defined -\newif\ificlrfinal -\iclrfinalfalse -\def\iclrfinalcopy{\iclrfinaltrue} -\font\iclrtenhv = phvb at 8pt - -% Specify the dimensions of each page - -\setlength{\paperheight}{11in} -\setlength{\paperwidth}{8.5in} - - -\oddsidemargin .5in % Note \oddsidemargin = \evensidemargin -\evensidemargin .5in -\marginparwidth 0.07 true in -%\marginparwidth 0.75 true in -%\topmargin 0 true pt % Nominal distance from top of page to top of -%\topmargin 0.125in -\topmargin -0.625in -\addtolength{\headsep}{0.25in} -\textheight 9.0 true in % Height of text (including footnotes & figures) -\textwidth 5.5 true in % Width of text line. -\widowpenalty=10000 -\clubpenalty=10000 - -% \thispagestyle{empty} \pagestyle{empty} -\flushbottom \sloppy - -% We're never going to need a table of contents, so just flush it to -% save space --- suggested by drstrip@sandia-2 -\def\addcontentsline#1#2#3{} - -% Title stuff, taken from deproc. -\def\maketitle{\par -\begingroup - \def\thefootnote{\fnsymbol{footnote}} - \def\@makefnmark{\hbox to 0pt{$^{\@thefnmark}$\hss}} % for perfect author - % name centering -% The footnote-mark was overlapping the footnote-text, -% added the following to fix this problem (MK) - \long\def\@makefntext##1{\parindent 1em\noindent - \hbox to1.8em{\hss $\m@th ^{\@thefnmark}$}##1} - \@maketitle \@thanks -\endgroup -\setcounter{footnote}{0} -\let\maketitle\relax \let\@maketitle\relax -\gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax} - -% The toptitlebar has been raised to top-justify the first page - -\usepackage{fancyhdr} -\pagestyle{fancy} -\fancyhead{} - -% Title (includes both anonimized and non-anonimized versions) -\def\@maketitle{\vbox{\hsize\textwidth -%\linewidth\hsize \vskip 0.1in \toptitlebar \centering -{\LARGE\sc \@title\par} -%\bottomtitlebar % \vskip 0.1in % minus -\ificlrfinal - \lhead{Published as a conference paper at ICLR 2018} - \def\And{\end{tabular}\hfil\linebreak[0]\hfil - \begin{tabular}[t]{l}\bf\rule{\z@}{24pt}\ignorespaces}% - \def\AND{\end{tabular}\hfil\linebreak[4]\hfil - \begin{tabular}[t]{l}\bf\rule{\z@}{24pt}\ignorespaces}% - \begin{tabular}[t]{l}\bf\rule{\z@}{24pt}\@author\end{tabular}% -\else - \lhead{Under review as a conference paper at ICLR 2018} - \def\And{\end{tabular}\hfil\linebreak[0]\hfil - \begin{tabular}[t]{l}\bf\rule{\z@}{24pt}\ignorespaces}% - \def\AND{\end{tabular}\hfil\linebreak[4]\hfil - \begin{tabular}[t]{l}\bf\rule{\z@}{24pt}\ignorespaces}% - \begin{tabular}[t]{l}\bf\rule{\z@}{24pt}Anonymous authors\\Paper under double-blind review\end{tabular}% -\fi -\vskip 0.3in minus 0.1in}} - -\renewenvironment{abstract}{\vskip.075in\centerline{\large\sc -Abstract}\vspace{0.5ex}\begin{quote}}{\par\end{quote}\vskip 1ex} - -% sections with less space -\def\section{\@startsection {section}{1}{\z@}{-2.0ex plus - -0.5ex minus -.2ex}{1.5ex plus 0.3ex -minus0.2ex}{\large\sc\raggedright}} - -\def\subsection{\@startsection{subsection}{2}{\z@}{-1.8ex plus --0.5ex minus -.2ex}{0.8ex plus .2ex}{\normalsize\sc\raggedright}} -\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-1.5ex -plus -0.5ex minus -.2ex}{0.5ex plus -.2ex}{\normalsize\sc\raggedright}} -\def\paragraph{\@startsection{paragraph}{4}{\z@}{1.5ex plus -0.5ex minus .2ex}{-1em}{\normalsize\bf}} -\def\subparagraph{\@startsection{subparagraph}{5}{\z@}{1.5ex plus - 0.5ex minus .2ex}{-1em}{\normalsize\sc}} -\def\subsubsubsection{\vskip -5pt{\noindent\normalsize\rm\raggedright}} - - -% Footnotes -\footnotesep 6.65pt % -\skip\footins 9pt plus 4pt minus 2pt -\def\footnoterule{\kern-3pt \hrule width 12pc \kern 2.6pt } -\setcounter{footnote}{0} - -% Lists and paragraphs -\parindent 0pt -\topsep 4pt plus 1pt minus 2pt -\partopsep 1pt plus 0.5pt minus 0.5pt -\itemsep 2pt plus 1pt minus 0.5pt -\parsep 2pt plus 1pt minus 0.5pt -\parskip .5pc - - -%\leftmargin2em -\leftmargin3pc -\leftmargini\leftmargin \leftmarginii 2em -\leftmarginiii 1.5em \leftmarginiv 1.0em \leftmarginv .5em - -%\labelsep \labelsep 5pt - -\def\@listi{\leftmargin\leftmargini} -\def\@listii{\leftmargin\leftmarginii - \labelwidth\leftmarginii\advance\labelwidth-\labelsep - \topsep 2pt plus 1pt minus 0.5pt - \parsep 1pt plus 0.5pt minus 0.5pt - \itemsep \parsep} -\def\@listiii{\leftmargin\leftmarginiii - \labelwidth\leftmarginiii\advance\labelwidth-\labelsep - \topsep 1pt plus 0.5pt minus 0.5pt - \parsep \z@ \partopsep 0.5pt plus 0pt minus 0.5pt - \itemsep \topsep} -\def\@listiv{\leftmargin\leftmarginiv - \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} -\def\@listv{\leftmargin\leftmarginv - \labelwidth\leftmarginv\advance\labelwidth-\labelsep} -\def\@listvi{\leftmargin\leftmarginvi - \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} - -\abovedisplayskip 7pt plus2pt minus5pt% -\belowdisplayskip \abovedisplayskip -\abovedisplayshortskip 0pt plus3pt% -\belowdisplayshortskip 4pt plus3pt minus3pt% - -% Less leading in most fonts (due to the narrow columns) -% The choices were between 1-pt and 1.5-pt leading -%\def\@normalsize{\@setsize\normalsize{11pt}\xpt\@xpt} % got rid of @ (MK) -\def\normalsize{\@setsize\normalsize{11pt}\xpt\@xpt} -\def\small{\@setsize\small{10pt}\ixpt\@ixpt} -\def\footnotesize{\@setsize\footnotesize{10pt}\ixpt\@ixpt} -\def\scriptsize{\@setsize\scriptsize{8pt}\viipt\@viipt} -\def\tiny{\@setsize\tiny{7pt}\vipt\@vipt} -\def\large{\@setsize\large{14pt}\xiipt\@xiipt} -\def\Large{\@setsize\Large{16pt}\xivpt\@xivpt} -\def\LARGE{\@setsize\LARGE{20pt}\xviipt\@xviipt} -\def\huge{\@setsize\huge{23pt}\xxpt\@xxpt} -\def\Huge{\@setsize\Huge{28pt}\xxvpt\@xxvpt} - -\def\toptitlebar{\hrule height4pt\vskip .25in\vskip-\parskip} - -\def\bottomtitlebar{\vskip .29in\vskip-\parskip\hrule height1pt\vskip -.09in} % -%Reduced second vskip to compensate for adding the strut in \@author - - -%% % Vertical Ruler -%% % This code is, largely, from the CVPR 2010 conference style file -%% % ----- define vruler -%% \makeatletter -%% \newbox\iclrrulerbox -%% \newcount\iclrrulercount -%% \newdimen\iclrruleroffset -%% \newdimen\cv@lineheight -%% \newdimen\cv@boxheight -%% \newbox\cv@tmpbox -%% \newcount\cv@refno -%% \newcount\cv@tot -%% % NUMBER with left flushed zeros \fillzeros[] -%% \newcount\cv@tmpc@ \newcount\cv@tmpc -%% \def\fillzeros[#1]#2{\cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi -%% \cv@tmpc=1 % -%% \loop\ifnum\cv@tmpc@<10 \else \divide\cv@tmpc@ by 10 \advance\cv@tmpc by 1 \fi -%% \ifnum\cv@tmpc@=10\relax\cv@tmpc@=11\relax\fi \ifnum\cv@tmpc@>10 \repeat -%% \ifnum#2<0\advance\cv@tmpc1\relax-\fi -%% \loop\ifnum\cv@tmpc<#1\relax0\advance\cv@tmpc1\relax\fi \ifnum\cv@tmpc<#1 \repeat -%% \cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi \relax\the\cv@tmpc@}% -%% % \makevruler[][][][][] -%% \def\makevruler[#1][#2][#3][#4][#5]{\begingroup\offinterlineskip -%% \textheight=#5\vbadness=10000\vfuzz=120ex\overfullrule=0pt% -%% \global\setbox\iclrrulerbox=\vbox to \textheight{% -%% {\parskip=0pt\hfuzz=150em\cv@boxheight=\textheight -%% \cv@lineheight=#1\global\iclrrulercount=#2% -%% \cv@tot\cv@boxheight\divide\cv@tot\cv@lineheight\advance\cv@tot2% -%% \cv@refno1\vskip-\cv@lineheight\vskip1ex% -%% \loop\setbox\cv@tmpbox=\hbox to0cm{{\iclrtenhv\hfil\fillzeros[#4]\iclrrulercount}}% -%% \ht\cv@tmpbox\cv@lineheight\dp\cv@tmpbox0pt\box\cv@tmpbox\break -%% \advance\cv@refno1\global\advance\iclrrulercount#3\relax -%% \ifnum\cv@refno<\cv@tot\repeat}}\endgroup}% -%% \makeatother -%% % ----- end of vruler - -%% % \makevruler[][][][][] -%% \def\iclrruler#1{\makevruler[12pt][#1][1][3][0.993\textheight]\usebox{\iclrrulerbox}} -%% \AddToShipoutPicture{% -%% \ificlrfinal\else -%% \iclrruleroffset=\textheight -%% \advance\iclrruleroffset by -3.7pt -%% \color[rgb]{.7,.7,.7} -%% \AtTextUpperLeft{% -%% \put(\LenToUnit{-35pt},\LenToUnit{-\iclrruleroffset}){%left ruler -%% \iclrruler{\iclrrulercount}} -%% } -%% \fi -%% } -%%% To add a vertical bar on the side -%\AddToShipoutPicture{ -%\AtTextLowerLeft{ -%\hspace*{-1.8cm} -%\colorbox[rgb]{0.7,0.7,0.7}{\small \parbox[b][\textheight]{0.1cm}{}}} -%} - diff --git a/docs/cohen_et_al_2018/molecule_rendering_U_1.pdf b/docs/cohen_et_al_2018/molecule_rendering_U_1.pdf deleted file mode 100644 index d71908c..0000000 Binary files a/docs/cohen_et_al_2018/molecule_rendering_U_1.pdf and /dev/null differ diff --git a/docs/cohen_et_al_2018/molecule_rendering_U_16.pdf b/docs/cohen_et_al_2018/molecule_rendering_U_16.pdf deleted file mode 100644 index 2831dc0..0000000 Binary files a/docs/cohen_et_al_2018/molecule_rendering_U_16.pdf and /dev/null differ diff --git a/docs/cohen_et_al_2018/molecule_rendering_U_6.pdf b/docs/cohen_et_al_2018/molecule_rendering_U_6.pdf deleted file mode 100644 index 4ec30b6..0000000 Binary files a/docs/cohen_et_al_2018/molecule_rendering_U_6.pdf and /dev/null differ diff --git a/docs/cohen_et_al_2018/molecule_rendering_U_7.pdf b/docs/cohen_et_al_2018/molecule_rendering_U_7.pdf deleted file mode 100644 index 2836631..0000000 Binary files a/docs/cohen_et_al_2018/molecule_rendering_U_7.pdf and /dev/null differ diff --git a/docs/cohen_et_al_2018/molecule_rendering_U_8.pdf b/docs/cohen_et_al_2018/molecule_rendering_U_8.pdf deleted file mode 100644 index 8c8ab41..0000000 Binary files a/docs/cohen_et_al_2018/molecule_rendering_U_8.pdf and /dev/null differ diff --git a/docs/cohen_et_al_2018/molecule_rendering_types.pdf b/docs/cohen_et_al_2018/molecule_rendering_types.pdf deleted file mode 100644 index 83331f3..0000000 Binary files a/docs/cohen_et_al_2018/molecule_rendering_types.pdf and /dev/null differ diff --git a/docs/cohen_et_al_2018/natbib.sty b/docs/cohen_et_al_2018/natbib.sty deleted file mode 100644 index ff0d0b9..0000000 --- a/docs/cohen_et_al_2018/natbib.sty +++ /dev/null @@ -1,1246 +0,0 @@ -%% -%% This is file `natbib.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% natbib.dtx (with options: `package,all') -%% ============================================= -%% IMPORTANT NOTICE: -%% -%% This program can be redistributed and/or modified under the terms -%% of the LaTeX Project Public License Distributed from CTAN -%% archives in directory macros/latex/base/lppl.txt; either -%% version 1 of the License, or any later version. -%% -%% This is a generated file. -%% It may not be distributed without the original source file natbib.dtx. -%% -%% Full documentation can be obtained by LaTeXing that original file. -%% Only a few abbreviated comments remain here to describe the usage. -%% ============================================= -%% Copyright 1993-2009 Patrick W Daly -%% Max-Planck-Institut f\"ur Sonnensystemforschung -%% Max-Planck-Str. 2 -%% D-37191 Katlenburg-Lindau -%% Germany -%% E-mail: daly@mps.mpg.de -\NeedsTeXFormat{LaTeX2e}[1995/06/01] -\ProvidesPackage{natbib} - [2009/07/16 8.31 (PWD, AO)] - - % This package reimplements the LaTeX \cite command to be used for various - % citation styles, both author-year and numerical. It accepts BibTeX - % output intended for many other packages, and therefore acts as a - % general, all-purpose citation-style interface. - % - % With standard numerical .bst files, only numerical citations are - % possible. With an author-year .bst file, both numerical and - % author-year citations are possible. - % - % If author-year citations are selected, \bibitem must have one of the - % following forms: - % \bibitem[Jones et al.(1990)]{key}... - % \bibitem[Jones et al.(1990)Jones, Baker, and Williams]{key}... - % \bibitem[Jones et al., 1990]{key}... - % \bibitem[\protect\citeauthoryear{Jones, Baker, and Williams}{Jones - % et al.}{1990}]{key}... - % \bibitem[\protect\citeauthoryear{Jones et al.}{1990}]{key}... - % \bibitem[\protect\astroncite{Jones et al.}{1990}]{key}... - % \bibitem[\protect\citename{Jones et al., }1990]{key}... - % \harvarditem[Jones et al.]{Jones, Baker, and Williams}{1990}{key}... - % - % This is either to be made up manually, or to be generated by an - % appropriate .bst file with BibTeX. - % Author-year mode || Numerical mode - % Then, \citet{key} ==>> Jones et al. (1990) || Jones et al. [21] - % \citep{key} ==>> (Jones et al., 1990) || [21] - % Multiple citations as normal: - % \citep{key1,key2} ==>> (Jones et al., 1990; Smith, 1989) || [21,24] - % or (Jones et al., 1990, 1991) || [21,24] - % or (Jones et al., 1990a,b) || [21,24] - % \cite{key} is the equivalent of \citet{key} in author-year mode - % and of \citep{key} in numerical mode - % Full author lists may be forced with \citet* or \citep*, e.g. - % \citep*{key} ==>> (Jones, Baker, and Williams, 1990) - % Optional notes as: - % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) - % \citep[e.g.,][]{key} ==>> (e.g., Jones et al., 1990) - % \citep[see][pg. 34]{key}==>> (see Jones et al., 1990, pg. 34) - % (Note: in standard LaTeX, only one note is allowed, after the ref. - % Here, one note is like the standard, two make pre- and post-notes.) - % \citealt{key} ==>> Jones et al. 1990 - % \citealt*{key} ==>> Jones, Baker, and Williams 1990 - % \citealp{key} ==>> Jones et al., 1990 - % \citealp*{key} ==>> Jones, Baker, and Williams, 1990 - % Additional citation possibilities (both author-year and numerical modes) - % \citeauthor{key} ==>> Jones et al. - % \citeauthor*{key} ==>> Jones, Baker, and Williams - % \citeyear{key} ==>> 1990 - % \citeyearpar{key} ==>> (1990) - % \citetext{priv. comm.} ==>> (priv. comm.) - % \citenum{key} ==>> 11 [non-superscripted] - % Note: full author lists depends on whether the bib style supports them; - % if not, the abbreviated list is printed even when full requested. - % - % For names like della Robbia at the start of a sentence, use - % \Citet{dRob98} ==>> Della Robbia (1998) - % \Citep{dRob98} ==>> (Della Robbia, 1998) - % \Citeauthor{dRob98} ==>> Della Robbia - % - % - % Citation aliasing is achieved with - % \defcitealias{key}{text} - % \citetalias{key} ==>> text - % \citepalias{key} ==>> (text) - % - % Defining the citation mode and punctual (citation style) - % \setcitestyle{} - % Example: \setcitestyle{square,semicolon} - % Alternatively: - % Use \bibpunct with 6 mandatory arguments: - % 1. opening bracket for citation - % 2. closing bracket - % 3. citation separator (for multiple citations in one \cite) - % 4. the letter n for numerical styles, s for superscripts - % else anything for author-year - % 5. punctuation between authors and date - % 6. punctuation between years (or numbers) when common authors missing - % One optional argument is the character coming before post-notes. It - % appears in square braces before all other arguments. May be left off. - % Example (and default) \bibpunct[, ]{(}{)}{;}{a}{,}{,} - % - % To make this automatic for a given bib style, named newbib, say, make - % a local configuration file, natbib.cfg, with the definition - % \newcommand{\bibstyle@newbib}{\bibpunct...} - % Then the \bibliographystyle{newbib} will cause \bibstyle@newbib to - % be called on THE NEXT LATEX RUN (via the aux file). - % - % Such preprogrammed definitions may be invoked anywhere in the text - % by calling \citestyle{newbib}. This is only useful if the style specified - % differs from that in \bibliographystyle. - % - % With \citeindextrue and \citeindexfalse, one can control whether the - % \cite commands make an automatic entry of the citation in the .idx - % indexing file. For this, \makeindex must also be given in the preamble. - % - % Package Options: (for selecting punctuation) - % round - round parentheses are used (default) - % square - square brackets are used [option] - % curly - curly braces are used {option} - % angle - angle brackets are used