diff options
| author | hachem <im@hachem.wtf> | 2026-09-14 12:20:52 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-14 12:20:52 +0200 |
| commit | ee14ad272e68d9363202d7f668e0b20302827209 (patch) | |
| tree | 88dd1012ad7f9d6ac7abeb7562dac2194794b823 /src/visualizer | |
| parent | ae07aab1442a45bbddb79e066f15eaf252a4254a (diff) | |
feat: simd + testing + formatting
Diffstat (limited to 'src/visualizer')
| -rw-r--r-- | src/visualizer/grid.c | 24 | ||||
| -rw-r--r-- | src/visualizer/grid.h | 18 | ||||
| -rw-r--r-- | src/visualizer/horizontal_cli.c | 74 | ||||
| -rw-r--r-- | src/visualizer/vertical_cli.c | 31 |
4 files changed, 75 insertions, 72 deletions
diff --git a/src/visualizer/grid.c b/src/visualizer/grid.c index 5f95efc..32ade1b 100644 --- a/src/visualizer/grid.c +++ b/src/visualizer/grid.c @@ -18,7 +18,7 @@ static size_t glyph_bytes(unsigned char lead) return 1; } -size_t psi_utf8_count(const char *s) +size_t psi_utf8_count(const char* s) { size_t count = 0; while (*s) @@ -32,15 +32,14 @@ size_t psi_utf8_count(const char *s) struct PsiStringBuilder psi_new_string_builder(void) { - return (struct PsiStringBuilder) - { + return (struct PsiStringBuilder){ NULL, 0, 0, }; } -void psi_string_builder_append(struct PsiStringBuilder *sb, const char *s) +void psi_string_builder_append(struct PsiStringBuilder* sb, const char* s) { size_t n = strlen(s); if (sb->len + n + 1 > sb->cap) @@ -58,7 +57,7 @@ void psi_string_builder_append(struct PsiStringBuilder *sb, const char *s) sb->len += n; } -char *psi_string_builder_finish(struct PsiStringBuilder *sb) +char* psi_string_builder_finish(struct PsiStringBuilder* sb) { if (sb->data == NULL) psi_string_builder_append(sb, ""); @@ -74,21 +73,20 @@ struct PsiGlyphRow psi_new_glyph_row(size_t width) for (size_t i = 0; i < width; i++) memcpy(cells[i], " ", 2); - return (struct PsiGlyphRow) - { + return (struct PsiGlyphRow){ cells, width, }; } -void psi_free_glyph_row(struct PsiGlyphRow *row) +void psi_free_glyph_row(struct PsiGlyphRow* row) { free(row->cells); row->cells = NULL; row->width = 0; } -void psi_glyph_row_set(struct PsiGlyphRow *row, size_t index, const char *glyph) +void psi_glyph_row_set(struct PsiGlyphRow* row, size_t index, const char* glyph) { if (index >= row->width) return; @@ -98,10 +96,10 @@ void psi_glyph_row_set(struct PsiGlyphRow *row, size_t index, const char *glyph) row->cells[index][n] = '\0'; } -size_t psi_glyph_row_place(struct PsiGlyphRow *row, size_t start, const char *utf8) +size_t psi_glyph_row_place(struct PsiGlyphRow* row, size_t start, const char* utf8) { size_t count = 0; - const char *p = utf8; + const char* p = utf8; while (*p) { @@ -120,14 +118,14 @@ size_t psi_glyph_row_place(struct PsiGlyphRow *row, size_t start, const char *ut return count; } -void psi_glyph_row_fill_space(struct PsiGlyphRow *row, size_t from, size_t to, const char *glyph) +void psi_glyph_row_fill_space(struct PsiGlyphRow* row, size_t from, size_t to, const char* glyph) { for (size_t i = from; i < to && i < row->width; i++) if (strcmp(row->cells[i], " ") == 0) psi_glyph_row_set(row, i, glyph); } -void psi_glyph_row_render(struct PsiGlyphRow row, struct PsiStringBuilder *sb) +void psi_glyph_row_render(struct PsiGlyphRow row, struct PsiStringBuilder* sb) { for (size_t i = 0; i < row.width; i++) psi_string_builder_append(sb, row.cells[i]); diff --git a/src/visualizer/grid.h b/src/visualizer/grid.h index f327df8..9353433 100644 --- a/src/visualizer/grid.h +++ b/src/visualizer/grid.h @@ -4,14 +4,14 @@ struct PsiStringBuilder { - char *data; + char* data; size_t len; size_t cap; }; struct PsiStringBuilder psi_new_string_builder(void); -void psi_string_builder_append(struct PsiStringBuilder *sb, const char *s); -char *psi_string_builder_finish(struct PsiStringBuilder *sb); +void psi_string_builder_append(struct PsiStringBuilder* sb, const char* s); +char* psi_string_builder_finish(struct PsiStringBuilder* sb); struct PsiGlyphRow { @@ -20,10 +20,10 @@ struct PsiGlyphRow }; struct PsiGlyphRow psi_new_glyph_row(size_t width); -void psi_free_glyph_row(struct PsiGlyphRow *row); -void psi_glyph_row_set(struct PsiGlyphRow *row, size_t index, const char *glyph); -size_t psi_glyph_row_place(struct PsiGlyphRow *row, size_t start, const char *utf8); -void psi_glyph_row_fill_space(struct PsiGlyphRow *row, size_t from, size_t to, const char *glyph); -void psi_glyph_row_render(struct PsiGlyphRow row, struct PsiStringBuilder *sb); +void psi_free_glyph_row(struct PsiGlyphRow* row); +void psi_glyph_row_set(struct PsiGlyphRow* row, size_t index, const char* glyph); +size_t psi_glyph_row_place(struct PsiGlyphRow* row, size_t start, const char* utf8); +void psi_glyph_row_fill_space(struct PsiGlyphRow* row, size_t from, size_t to, const char* glyph); +void psi_glyph_row_render(struct PsiGlyphRow row, struct PsiStringBuilder* sb); -size_t psi_utf8_count(const char *s); +size_t psi_utf8_count(const char* s); diff --git a/src/visualizer/horizontal_cli.c b/src/visualizer/horizontal_cli.c index e8d0570..56a2e00 100644 --- a/src/visualizer/horizontal_cli.c +++ b/src/visualizer/horizontal_cli.c @@ -8,7 +8,7 @@ #include "visualizer/grid.h" -static void append_repeat(struct PsiStringBuilder *sb, const char *glyph, size_t n) +static void append_repeat(struct PsiStringBuilder* sb, const char* glyph, size_t n) { for (size_t i = 0; i < n; i++) psi_string_builder_append(sb, glyph); @@ -34,14 +34,12 @@ static bool is_single_target(enum PsiGateKind kind) case PSI_GATE_P: case PSI_GATE_U1: case PSI_GATE_U2: - case PSI_GATE_U3: - return true; - default: - return false; + case PSI_GATE_U3: return true; + default: return false; } } -static void single_label(struct PsiGateOp op, char *out, size_t cap) +static void single_label(struct PsiGateOp op, char* out, size_t cap) { switch (op.kind) { @@ -66,7 +64,7 @@ static void single_label(struct PsiGateOp op, char *out, size_t cap) } } -static void controlled_label(struct PsiGateOp op, char *out, size_t cap) +static void controlled_label(struct PsiGateOp op, char* out, size_t cap) { switch (op.kind) { @@ -85,20 +83,18 @@ static bool is_param_controlled(enum PsiGateKind kind) case PSI_GATE_CRX: case PSI_GATE_CRY: case PSI_GATE_CRZ: - case PSI_GATE_CP: - return true; - default: - return false; + case PSI_GATE_CP: return true; + default: return false; } } -char *psi_render_circuit_horizontal(const struct PsiQuantumCircuit *circuit) +char* psi_render_circuit_horizontal(const struct PsiQuantumCircuit* circuit) { size_t nq = circuit->num_qubits; size_t nc = circuit->num_classical; - struct PsiStringBuilder *q = nq > 0 ? malloc(nq * sizeof(struct PsiStringBuilder)) : NULL; - struct PsiStringBuilder *c = nc > 0 ? malloc(nc * sizeof(struct PsiStringBuilder)) : NULL; + struct PsiStringBuilder* q = nq > 0 ? malloc(nq * sizeof(struct PsiStringBuilder)) : NULL; + struct PsiStringBuilder* c = nc > 0 ? malloc(nc * sizeof(struct PsiStringBuilder)) : NULL; assert(q != NULL || nq == 0); assert(c != NULL || nc == 0); @@ -152,7 +148,7 @@ char *psi_render_circuit_horizontal(const struct PsiQuantumCircuit *circuit) struct PsiGateOp op = circuit->operations[oi]; size_t tc; - const size_t *targets = psi_gate_op_quantum_targets(&op, &tc); + const size_t* targets = psi_gate_op_quantum_targets(&op, &tc); size_t min_q = targets[0]; size_t max_q = targets[0]; for (size_t k = 1; k < tc; k++) @@ -216,40 +212,52 @@ char *psi_render_circuit_horizontal(const struct PsiQuantumCircuit *circuit) append_repeat(&c[i], "═", w + 2); append_repeat(&gap, " ", w + 2); } - else if (op.kind == PSI_GATE_CNOT || op.kind == PSI_GATE_CZ || op.kind == PSI_GATE_SWAP - || op.kind == PSI_GATE_CCNOT || op.kind == PSI_GATE_CSWAP) + else if (op.kind == PSI_GATE_CNOT || op.kind == PSI_GATE_CZ || op.kind == PSI_GATE_SWAP || + op.kind == PSI_GATE_CCNOT || op.kind == PSI_GATE_CSWAP) { for (size_t i = 0; i < nq; i++) { - const char *seg = "─────"; + const char* seg = "─────"; switch (op.kind) { case PSI_GATE_CNOT: - if (i == op.qubits[0]) seg = "──●──"; - else if (i == op.qubits[1]) seg = "──⊕──"; - else if (i > min_q && i < max_q) seg = "──│──"; + if (i == op.qubits[0]) + seg = "──●──"; + else if (i == op.qubits[1]) + seg = "──⊕──"; + else if (i > min_q && i < max_q) + seg = "──│──"; break; case PSI_GATE_CZ: - if (i == op.qubits[0] || i == op.qubits[1]) seg = "──●──"; - else if (i > min_q && i < max_q) seg = "──│──"; + if (i == op.qubits[0] || i == op.qubits[1]) + seg = "──●──"; + else if (i > min_q && i < max_q) + seg = "──│──"; break; case PSI_GATE_SWAP: - if (i == op.qubits[0] || i == op.qubits[1]) seg = "──╳──"; - else if (i > min_q && i < max_q) seg = "──│──"; + if (i == op.qubits[0] || i == op.qubits[1]) + seg = "──╳──"; + else if (i > min_q && i < max_q) + seg = "──│──"; break; case PSI_GATE_CCNOT: - if (i == op.qubits[0] || i == op.qubits[1]) seg = "──●──"; - else if (i == op.qubits[2]) seg = "──⊕──"; - else if (i > min_q && i < max_q) seg = "──│──"; + if (i == op.qubits[0] || i == op.qubits[1]) + seg = "──●──"; + else if (i == op.qubits[2]) + seg = "──⊕──"; + else if (i > min_q && i < max_q) + seg = "──│──"; break; case PSI_GATE_CSWAP: - if (i == op.qubits[0]) seg = "──●──"; - else if (i == op.qubits[1] || i == op.qubits[2]) seg = "──╳──"; - else if (i > min_q && i < max_q) seg = "──│──"; - break; - default: + if (i == op.qubits[0]) + seg = "──●──"; + else if (i == op.qubits[1] || i == op.qubits[2]) + seg = "──╳──"; + else if (i > min_q && i < max_q) + seg = "──│──"; break; + default: break; } psi_string_builder_append(&q[i], seg); diff --git a/src/visualizer/vertical_cli.c b/src/visualizer/vertical_cli.c index 09d4456..4f21e49 100644 --- a/src/visualizer/vertical_cli.c +++ b/src/visualizer/vertical_cli.c @@ -5,7 +5,7 @@ #include "visualizer/grid.h" -static void gate_label(struct PsiGateOp op, char *out, size_t cap) +static void gate_label(struct PsiGateOp op, char* out, size_t cap) { switch (op.kind) { @@ -40,7 +40,7 @@ static void gate_label(struct PsiGateOp op, char *out, size_t cap) } } -static size_t calculate_col_width(const struct PsiQuantumCircuit *circuit) +static size_t calculate_col_width(const struct PsiQuantumCircuit* circuit) { size_t max_label = 3; @@ -80,10 +80,8 @@ static bool is_single_target(enum PsiGateKind kind) case PSI_GATE_P: case PSI_GATE_U1: case PSI_GATE_U2: - case PSI_GATE_U3: - return true; - default: - return false; + case PSI_GATE_U3: return true; + default: return false; } } @@ -94,14 +92,12 @@ static bool is_param_controlled(enum PsiGateKind kind) case PSI_GATE_CRX: case PSI_GATE_CRY: case PSI_GATE_CRZ: - case PSI_GATE_CP: - return true; - default: - return false; + case PSI_GATE_CP: return true; + default: return false; } } -char *psi_render_circuit_vertical(const struct PsiQuantumCircuit *circuit) +char* psi_render_circuit_vertical(const struct PsiQuantumCircuit* circuit) { struct PsiStringBuilder sb = psi_new_string_builder(); @@ -154,7 +150,7 @@ char *psi_render_circuit_vertical(const struct PsiQuantumCircuit *circuit) struct PsiGateOp op = circuit->operations[op_index]; size_t target_count; - const size_t *targets = psi_gate_op_quantum_targets(&op, &target_count); + const size_t* targets = psi_gate_op_quantum_targets(&op, &target_count); size_t min_q = targets[0]; size_t max_q = targets[0]; for (size_t i = 1; i < target_count; i++) @@ -212,8 +208,8 @@ char *psi_render_circuit_vertical(const struct PsiQuantumCircuit *circuit) else if (op.kind == PSI_GATE_CCNOT || op.kind == PSI_GATE_CSWAP) { bool is_cswap = op.kind == PSI_GATE_CSWAP; - const char *sym_c = "●"; - const char *sym_t = is_cswap ? "╳" : "⊕"; + const char* sym_c = "●"; + const char* sym_t = is_cswap ? "╳" : "⊕"; size_t c1 = op.qubits[0]; size_t c2 = op.qubits[1]; size_t t = op.qubits[2]; @@ -267,7 +263,8 @@ char *psi_render_circuit_vertical(const struct PsiQuantumCircuit *circuit) psi_glyph_row_set(&row, center, "□"); } - psi_glyph_row_fill_space(&row, min_q * stride + half + 1, max_q * stride + half, "─"); + psi_glyph_row_fill_space(&row, min_q * stride + half + 1, max_q * stride + half, + "─"); } for (size_t i = 0; i < nc; i++) @@ -275,8 +272,8 @@ char *psi_render_circuit_vertical(const struct PsiQuantumCircuit *circuit) } else { - const char *sym1 = "●"; - const char *sym2 = "⊕"; + const char* sym1 = "●"; + const char* sym2 = "⊕"; if (op.kind == PSI_GATE_CZ) sym2 = "●"; else if (op.kind == PSI_GATE_SWAP) |
