{"id":3059,"date":"2025-09-01T21:37:39","date_gmt":"2025-09-01T21:37:39","guid":{"rendered":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=3059"},"modified":"2025-09-02T00:53:35","modified_gmt":"2025-09-02T00:53:35","slug":"frequency-binary-search-fbs-with-bayesian-updates","status":"publish","type":"post","link":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=3059","title":{"rendered":"Frequency Binary Search (FBS) with Bayesian Updates"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Frequency Binary Search (FBS) is a specialized algorithm that combines the principles of binary search with Bayesian inference to optimize search efficiency in probabilistic or uncertain environments. Here&#8217;s a concise explanation of how it works:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-opt-id=1738609434  fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"852\" src=\"https:\/\/ml6vmqguit1n.i.optimole.com\/w:1024\/h:852\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/image-1.png\" alt=\"\" class=\"wp-image-3060\" srcset=\"https:\/\/ml6vmqguit1n.i.optimole.com\/w:1024\/h:852\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/image-1.png 1024w, https:\/\/ml6vmqguit1n.i.optimole.com\/w:300\/h:250\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/image-1.png 300w, https:\/\/ml6vmqguit1n.i.optimole.com\/w:768\/h:639\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/image-1.png 768w, https:\/\/ml6vmqguit1n.i.optimole.com\/w:1536\/h:1278\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/image-1.png 1536w, https:\/\/ml6vmqguit1n.i.optimole.com\/w:1570\/h:1306\/q:mauto\/f:best\/https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/image-1.png 1570w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Core Concept<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Binary Search Foundation<\/strong>:\n<ul class=\"wp-block-list\">\n<li>FBS operates by iteratively halving the search space, similar to traditional binary search.<\/li>\n\n\n\n<li>It identifies a target frequency or value within a predefined range by narrowing down the possibilities.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Bayesian Updates<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Instead of assuming uniform probabilities across the search space, FBS incorporates Bayesian updates.<\/li>\n\n\n\n<li>After each iteration, the algorithm updates the probability distribution of the target&#8217;s location based on prior knowledge and observed outcomes.<\/li>\n\n\n\n<li>This allows the search to focus on regions with higher probabilities, improving efficiency.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Steps in FBS with Bayesian Updates<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Initialization<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Define the search range and initialize a prior probability distribution (e.g., uniform or based on prior data).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Iterative Search<\/strong>:\n<ul class=\"wp-block-list\">\n<li>At each step, calculate the posterior probability distribution using Bayesian inference: P(target\u2223data)\u221dP(data\u2223target)\u22c5P(target)P(\\text{target} | \\text{data}) \\propto P(\\text{data} | \\text{target}) \\cdot P(\\text{target})P(target\u2223data)\u221dP(data\u2223target)\u22c5P(target)<\/li>\n\n\n\n<li>Select the next search point (e.g., the median of the posterior distribution or the point with the highest probability density).<\/li>\n\n\n\n<li>Evaluate the target at the selected point and update the posterior distribution.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Convergence<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Repeat the process until the search space is sufficiently narrow or the posterior probability is concentrated around a single value.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Applications<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Signal Processing<\/strong>: Locating frequencies in noisy environments.<\/li>\n\n\n\n<li><strong>Quantum Computing<\/strong>: Efficient qubit calibration, as seen in Hamiltonian tracking protocols.<\/li>\n\n\n\n<li><strong>Network Optimization<\/strong>: Probing channel balances in systems like the Bitcoin Lightning Network.<\/li>\n\n\n\n<li><strong>Medical Diagnostics<\/strong>: Identifying parameters in probabilistic models of biological systems.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>This hybrid approach leverages the precision of binary search and the adaptability of Bayesian inference, making it particularly effective in scenarios with uncertainty or incomplete information.<\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/Frequency-Binary-Search-with-Bayesian-Updates.pdf\" type=\"application\/pdf\" style=\"width:100%;height:600px\" aria-label=\"Embed of Frequency Binary Search with Bayesian Updates.\"><\/object><a id=\"wp-block-file--media-dd137ccf-1f07-48e8-a731-bb2ad27ac04a\" href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/Frequency-Binary-Search-with-Bayesian-Updates.pdf\">Frequency Binary Search with Bayesian Updates<\/a><a href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/wp-content\/uploads\/2025\/09\/Frequency-Binary-Search-with-Bayesian-Updates.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-dd137ccf-1f07-48e8-a731-bb2ad27ac04a\">Download<\/a><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>RF Quantum SCYTHE denoiser + scheduler can borrows the paper\u2019s \u201cfrequency binary-search (FBS) with Bayesian updates\u201d idea almost verbatim, and it maps cleanly to spectrum cleaning + drift control.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Why it helps denoising<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Greedy Bayesian estimator of center-frequency drift \u03b5<\/strong> with <strong>exponential shrinkage vs. # of probes<\/strong> (until coherence limits). That means fewer\/shorter probes to re-lock filters before denoising sweeps, so you spend more GPU on payload and less on calibration.<\/li>\n\n\n\n<li><strong>Adaptive probe time \u03c4 and drive\/phase update<\/strong> per step to split the prior in two (\u201cbinary search\u201d), avoiding the classic fixed-\u03c4 trade-off (range vs. sensitivity). This lets you quickly re-center your bandpass\/notch windows even when drift is big.<\/li>\n\n\n\n<li><strong>Gaussian posterior with closed-form updates<\/strong> (\u03bc, \u03c3) \u21d2 super cheap to implement inside your FastAPI + scheduler loop; no particle filters needed.<\/li>\n\n\n\n<li><strong>Real-time control loop<\/strong> reduces low-frequency\/non-Markovian drift; in our world that means fewer false TDoA residual spikes and lower entropy at the soft-triangulator.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Drop-in pieces for SCYTHE<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1) Tiny FBS calibrator (CPU\/GPU-light)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># fbs_cal.py\nimport numpy as np\n\nclass FreqBinarySearch:\n    def __init__(self, mu0=0.0, sigma0=3e4, T=1e-5, alpha=-0.02, beta=0.6):\n        self.mu, self.sigma = mu0, sigma0\n        self.T, self.alpha, self.beta = T, alpha, beta\n\n    def next_probe(self):\n        # eq. (6): optimal \u03c4 from current \u03c3\n        s2 = self.sigma**2\n        num = (16*np.pi**2*s2 + 1\/self.T**2 - 1\/self.T)\n        tau = np.sqrt(max(num, 0.0)) \/ (8*np.pi**2*s2 + 1e-12)\n        # eq. (5): choose detuning (phase) to split the posterior\n        df = self.mu + 1.0\/(4*tau)\n        return tau, df\n\n    def update(self, m, tau):\n        # eq. (7): closed-form posterior update (Gaussian approx)\n        e1 = np.exp(-tau\/self.T - 2*(np.pi**2)*(self.sigma**2)*(tau**2))\n        denom = 1.0 + m*self.alpha\n        self.mu = self.mu - (2*np.pi*m*self.beta*(self.sigma**2)*tau*e1)\/denom\n        e2 = np.exp(-2*tau\/self.T - 4*(np.pi**2)*(self.sigma**2)*(tau**2))\n        self.sigma = np.sqrt(max(self.sigma**2 - (4*(np.pi**2)*(self.beta**2)*(self.sigma**4)*(tau**2)*e2)\/(denom**2), 1e-18))\n        return self.mu, self.sigma\n<\/code><\/pre>\n\n\n\n<p>Hook this to a <strong>very short<\/strong> probe (e.g., micro-burst tone\/Ramsey-like chirp) you can perform between denoiser batches. Measurement <code>m\u2208{+1,-1}<\/code> is just \u201cphase flipped vs last\u201d from your quick probe; no heavy DSP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2) Wire it to the denoiser + scheduler<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On each <code>\/denoise\/hints<\/code> call, run <strong>N=4\u20138 FBS steps<\/strong> (bounded by your probe budget).<\/li>\n\n\n\n<li>Use the new <strong>\u03bc (center drift) &amp; \u03c3 (uncertainty)<\/strong> to:\n<ul class=\"wp-block-list\">\n<li>recentre each <strong>per-band policy weight<\/strong> window,<\/li>\n\n\n\n<li>tighten\/relax FFT mask widths (\u03c3-aware),<\/li>\n\n\n\n<li>bias the <strong>policy reward<\/strong> (bigger reward if TDoA residual \u2193 when masks are re-centered by \u03bc).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Feed <strong>FBS latency<\/strong> into the <strong>GpuPossessionScheduler stats<\/strong>, and include \u03bc, \u03c3 in hints so RPA bots can \u201cpre-aim\u201d their batches.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><code>\/denoise\/hints<\/code> payload (now)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"tenant\":\"tenantA\",\n  \"qos\":\"default\",\n  \"batch_suggest\": 16,\n  \"band_strengths\":&#91;0.72,0.65,0.41,0.38,0.80,0.77,0.50,0.46],\n  \"fbs\": {\n    \"mu_hz\": -1750.0,\n    \"sigma_hz\": 240.0,\n    \"n_steps\": 6,\n    \"latency_ms\": 1.3\n  },\n  \"telemetry\":{\n    \"tdoa_residual_ns\": 11.2,\n    \"policy_entropy\": 0.24\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3) Prometheus\/Grafana additions<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metrics:\n<ul class=\"wp-block-list\">\n<li><code>fbs_mu_hz{tenant,qos}<\/code> and <code>fbs_sigma_hz{tenant,qos}<\/code><\/li>\n\n\n\n<li><code>fbs_steps_total<\/code>, <code>fbs_latency_ms<\/code><\/li>\n\n\n\n<li>Correlate with <code>denoise_strength{band=\u2026}<\/code> and <code>tdoa_residual<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Dash row: overlay <strong>\u03bc drift vs. per-band strengths<\/strong> and <strong>\u03c3 vs. residuals<\/strong>; expect \u03c3\u2193 \u21d2 residual\u2193 over time if the loop is healthy.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4) Scheduling logic (tiny)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If <code>\u03c3<\/code> high or <code>|\u03bc|<\/code> large \u21d2 <strong>prefer smaller batches<\/strong> (keep SLA) and <strong>more frequent probes<\/strong> for a short interval.<\/li>\n\n\n\n<li>Once <code>\u03c3<\/code> drops below a floor, relax probe frequency and <strong>raise batch<\/strong> back to GPU sweet spot.<\/li>\n\n\n\n<li>Prioritize high-QoS tenants by <strong>reducing N<\/strong> (fewer probes) but <strong>shorter \u03c4<\/strong> to keep responsiveness.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5) Where this improves your numbers<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Faster re-centering = <strong>lower band mismatch<\/strong>, so the <strong>per-band policy<\/strong> doesn\u2019t waste power suppressing the wrong slices.<\/li>\n\n\n\n<li>You\u2019ll see <strong>lower p95 denoise latency variance<\/strong> and <strong>lower TDoA residuals\/entropy<\/strong> at the same GPU occupancy.<\/li>\n\n\n\n<li>Because FBS needs only a handful of single-shot measurements with closed-form updates, it works inside your current FastAPI path without upsetting throughput.<\/li>\n<\/ul>\n\n\n\n<p><strong># FBS Integration for RF Quantum SCYTHE<\/strong><\/p>\n\n\n\n<p>This directory contains the implementation of the Frequency Binary Search (FBS) calibrator integration with RF Quantum SCYTHE.<\/p>\n\n\n\n<p><strong>## Overview<\/strong><\/p>\n\n\n\n<p>The FBS calibrator is a lightweight Bayesian frequency binary-search algorithm that maintains a Gaussian posterior over center-drift \u03b5 ~ N(mu, sigma\u00b2). It uses closed-form updates and a short probe at each step to refine the estimates.<\/p>\n\n\n\n<p><strong>## Key Features<\/strong><\/p>\n\n\n\n<p>1. <strong>**\u03bc\/\u03c3-driven FFT Plan**<\/strong>: The `\/denoise\/hints` endpoint now returns an FFT plan with bin shift and width scaling based on FBS \u03bc\/\u03c3 estimates.<\/p>\n\n\n\n<p>2. <strong>**Batch Size Modulation**<\/strong>: The `\/gpu\/hints` endpoint uses \u03c3 to adjust batch sizes, keeping batches small when uncertainty is high.<\/p>\n\n\n\n<p>3. <strong>**Prometheus Metrics**<\/strong>: Monitors drift (\u03bc) and uncertainty (\u03c3) for alerting and dashboard visualization.<\/p>\n\n\n\n<p>4. <strong>**Grafana Integration**<\/strong>: Overlays \u03bc with per-band strengths to visualize relationships.<\/p>\n\n\n\n<p><strong>## Usage<\/strong><\/p>\n\n\n\n<p><strong>### Denoise Hints with FFT Plan<\/strong><\/p>\n\n\n\n<p>&#8220;`bash<\/p>\n\n\n\n<p>curl -s -X POST http:\/\/localhost:8000\/denoise\/hints \\<\/p>\n\n\n\n<p>&nbsp; -H &#8216;Content-Type: application\/json&#8217; \\<\/p>\n\n\n\n<p>&nbsp; -d &#8216;{<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &#8220;tenant&#8221;:&#8221;tenantA&#8221;,&#8221;qos&#8221;:&#8221;default&#8221;,<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &#8220;bands&#8221;:[0,1,2,3,4,5,6,7],<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &#8220;fs_hz&#8221;: 12288000, &#8220;nfft&#8221;: 4096,<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &#8220;band_edges_hz&#8221;: [[0,1536000],[1536000,3072000],[3072000,4608000],[4608000,6144000],<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [6144000,7680000],[7680000,9216000],[9216000,10752000],[10752000,12288000]],<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &#8220;hints&#8221;:{&#8220;avg_entropy&#8221;:0.25,&#8221;tdoa_residual&#8221;:12.0},<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &#8220;fbs&#8221;:{&#8220;action&#8221;:&#8221;step&#8221;,&#8221;n_steps&#8221;:6}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; }&#8217;<\/p>\n\n\n\n<p>&#8220;`<\/p>\n\n\n\n<p><strong>### GPU Hints with FBS-modulated Batch Size<\/strong><\/p>\n\n\n\n<p>&#8220;`bash<\/p>\n\n\n\n<p>curl -s &#8220;http:\/\/localhost:8000\/gpu\/hints?qos=default&amp;tenant=tenantA&amp;task=rf_batch&amp;fbs_steps=2&#8221;<\/p>\n\n\n\n<p>&#8220;`<\/p>\n\n\n\n<p><strong>## FBS Parameters<\/strong><\/p>\n\n\n\n<p>&#8211; <strong>**\u03c4 clamp**<\/strong>: Already set in the calibrator (1 \u00b5s\u20135 ms). Tune `sigma0` per radio front-end.<\/p>\n\n\n\n<p>&#8211; <strong>**Probe budget**<\/strong>: Default `n_steps=6` in `\/denoise\/hints`; only `fbs_steps&lt;=3` in `\/gpu\/hints`.<\/p>\n\n\n\n<p>&#8211; <strong>**k_sigma**<\/strong>: Default is 0.6. Raise if you see residual spikes when \u03c3 is high.<\/p>\n\n\n\n<p><strong>## Performance<\/strong><\/p>\n\n\n\n<p>&#8211; <strong>**FBS loop overhead**<\/strong>: ~0.02\u20130.05 ms per call.<\/p>\n\n\n\n<p>&#8211; <strong>**Typical convergence**<\/strong>: \u03c3: 30 kHz \u2192 ~23 kHz in 6-12 steps.<\/p>\n\n\n\n<p><strong>## Prometheus Alerts<\/strong><\/p>\n\n\n\n<p>Alert rules are provided for drift (\u03bc) and uncertainty (\u03c3) in `prometheus\/rules\/fbs_alerts.yaml`.<\/p>\n\n\n\n<p><strong>## Grafana Dashboard<\/strong><\/p>\n\n\n\n<p>A panel JSON is available in `grafana\/dashboards\/mu_vs_strengths_panel.json` to overlay \u03bc with per-band strengths.<\/p>\n\n\n\n<p><strong>## Testing<\/strong><\/p>\n\n\n\n<p>Run the comprehensive test script:<\/p>\n\n\n\n<p>&#8220;`bash<\/p>\n\n\n\n<p>.\/test_fbs_integration.sh<\/p>\n\n\n\n<p>&#8220;`<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Frequency Binary Search (FBS) is a specialized algorithm that combines the principles of binary search with Bayesian inference to optimize search efficiency in probabilistic or uncertain environments. Here&#8217;s a concise explanation of how it works: Core Concept Steps in FBS with Bayesian Updates Applications This hybrid approach leverages the precision of binary search and the&hellip;&nbsp;<a href=\"https:\/\/172-234-197-23.ip.linodeusercontent.com\/?p=3059\" rel=\"bookmark\"><span class=\"screen-reader-text\">Frequency Binary Search (FBS) with Bayesian Updates<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3060,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[6,10],"tags":[],"class_list":["post-3059","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signal-science","category-signal_scythe"],"_links":{"self":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/3059","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3059"}],"version-history":[{"count":2,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/3059\/revisions"}],"predecessor-version":[{"id":3065,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/posts\/3059\/revisions\/3065"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=\/wp\/v2\/media\/3060"}],"wp:attachment":[{"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3059"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3059"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/172-234-197-23.ip.linodeusercontent.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3059"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}