{ "cells": [ { "cell_type": "markdown", "id": "472d1671-a068-4ce5-afae-076586f0b1b3", "metadata": {}, "source": [ "
\n", "

Interactive Demos of C++ Libraries in the Browser

\n", "

Powered by Xeus-Cpp-Lite and WebAssembly

\n", "
\n", "\n", "This notebook demonstrates several powerful C++ libraries running entirely in the browser using **xeus-cpp-lite**. The examples span symbolic computation, numerical analysis, interactive visualization, and more — all compiled to WebAssembly and ready to run in a JupyterLite environment.\n", "\n", "**Featured libraries:**\n", "\n", "1. **Scientific Computation (Symbolic & Numeric)**: `boost`, `symengine`, `openblas`\n", "2. **Array based Computation through Xtensor-stack**: `xtl`, `xtensor`, `xsimd`, `xtensor-blas`\n", "3. **Utilities & Miscellaneous**: `nlohmann_json`, and others" ] }, { "cell_type": "markdown", "id": "c5f00d53-7cc9-43fb-82c7-c69b631e7b92", "metadata": {}, "source": [ "## Scientific Computation (Symbolic & Numeric)\n", "\n", "Let’s begin with powerful C++ libraries for symbolic math, high-precision arithmetic, and efficient numerical computation using BLAS and LAPACK routines." ] }, { "cell_type": "code", "execution_count": 1, "id": "7ef2ba09-bcc8-41e2-b503-3b21e60fdd3e", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Product of 98745636214564698 * 7459874565236544789 = \n", "736630060025131838840151335215258722" ] } ], "source": [ "#include \n", "using namespace boost::multiprecision;\n", "using namespace std;\n", "\n", "int128_t boost_product(long long A, long long B)\n", "{\n", " int128_t ans = (int128_t)A * B;\n", " return ans;\n", "}\n", "\n", "long long first = 98745636214564698;\n", "long long second = 7459874565236544789;\n", "cout << \"Product of \" << first << \" * \" << second << \" = \\n\"\n", " << boost_product(first, second);" ] }, { "cell_type": "code", "execution_count": 2, "id": "d8e235a1-5d41-43f8-8908-9f76b4c6c1d7", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [ "#include \n", "\n", "using namespace SymEngine;\n", "\n", "Expression x(\"x\");\n", "auto ex = pow(x + sqrt(Expression(2)), 6);" ] }, { "cell_type": "code", "execution_count": 3, "id": "82912670-8abf-4364-8bfb-b55e206fb153", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "data": { "text/latex": [ "$\\left(x + \\sqrt{2}\\right)^6$" ], "text/plain": [ "(x + sqrt(2))**6" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#include \n", "xcpp::display(ex);" ] }, { "cell_type": "code", "execution_count": 4, "id": "f738315b-f1ed-48b8-ae71-250b3667c694", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "data": { "text/latex": [ "$8 + 24 \\sqrt{2} x + 40 \\sqrt{2} x^3 + 6 \\sqrt{2} x^5 + 60 x^2 + 30 x^4 + x^6$" ], "text/plain": [ "8 + 24*sqrt(2)*x + 40*sqrt(2)*x**3 + 6*sqrt(2)*x**5 + 60*x**2 + 30*x**4 + x**6" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "auto expanded_ex = expand(ex);\n", "xcpp::display(expanded_ex);" ] }, { "cell_type": "code", "execution_count": 5, "id": "f25ec9b7-951e-4494-b932-64d71a601127", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LU Decomposition (OpenBLAS dgetrf_)\n", "info: 0\n", "\n", "Factorized Matrix (A after dgetrf_):\n", " 3.000000 6.000000 10.000000\n", " 0.333333 2.000000 3.666667\n", " 0.666667 0.500000 -0.500000\n", "\n", "Pivot Indices:\n", "3 3 3 \n" ] } ], "source": [ "#include \n", "#include \n", "\n", "typedef int INTEGER;\n", "typedef double DOUBLE;\n", "\n", "extern \"C\" {\n", " int dgetrf_(const INTEGER* m, const INTEGER* n, DOUBLE* a,\n", " const INTEGER* lda, INTEGER* ipiv, INTEGER* info);\n", "}\n", "\n", "const INTEGER m = 3, n = 3, lda = 3;\n", "DOUBLE A[9] = {\n", " 1.0, 2.0, 3.0,\n", " 4.0, 5.0, 6.0,\n", " 7.0, 8.0, 10.0\n", "}; // Column-major layout\n", "\n", "INTEGER ipiv[3];\n", "INTEGER info;\n", "\n", "dgetrf_(&m, &n, A, &lda, ipiv, &info);\n", "\n", "// Output\n", "std::cout << std::fixed << std::setprecision(6);\n", "std::cout << \"LU Decomposition (OpenBLAS dgetrf_)\\n\";\n", "std::cout << \"info: \" << info << \"\\n\\n\";\n", "\n", "std::cout << \"Factorized Matrix (A after dgetrf_):\\n\";\n", "for (int i = 0; i < m; ++i) {\n", " for (int j = 0; j < n; ++j)\n", " std::cout << std::setw(10) << A[i + j * lda];\n", " std::cout << \"\\n\";\n", "}\n", "\n", "std::cout << \"\\nPivot Indices:\\n\";\n", "for (int i = 0; i < std::min(m, n); ++i)\n", " std::cout << ipiv[i] << \" \";\n", "std::cout << \"\\n\";\n" ] }, { "cell_type": "markdown", "id": "6b7e64a2-546c-47a7-b4ed-95e98febd785", "metadata": {}, "source": [ "## Array based Computation through Xtensor-stack\n", "\n", "Explore NumPy-style array computing in C++ with Xtensor, Xtensor-BLAS, and Xsimd — enabling high-performance numerical and SIMD-accelerated workflows." ] }, { "cell_type": "code", "execution_count": 6, "id": "6496d5e7-d1e5-4437-be87-bb26b48ce735", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "data": { "text/html": [ "
  7.
 11.
 14.
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#include \"xtensor/containers/xarray.hpp\"\n", "#include \"xtensor/io/xio.hpp\"\n", "#include \"xtensor/views/xview.hpp\"\n", "\n", "xt::xarray arr1 = {{1.0, 2.0, 3.0}, {2.0, 5.0, 7.0}, {2.0, 5.0, 7.0}};\n", "xt::xarray arr2{5.0, 6.0, 7.0};\n", "\n", "xcpp::display(xt::view(arr1, 1) + arr2);" ] }, { "cell_type": "code", "execution_count": 7, "id": "c748227d-4083-4c19-8f07-a449d41e67fe", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "data": { "text/html": [ "
1
2
3
4
5
6
7
8
9
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xt::xarray arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};\n", "arr.reshape({3, 3});\n", "\n", "xcpp::display(arr);" ] }, { "cell_type": "code", "execution_count": 8, "id": "74298554-9964-4633-bff3-e67d03a1797d", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [ "#include \n", "#include \"xtensor-blas/xlinalg.hpp\"\n", "\n", "xt::xtensor M = {{1.5, 0.5}, {0.7, 1.0}};" ] }, { "cell_type": "code", "execution_count": 9, "id": "22dadb84-d39e-4028-a919-febd64f4a60d", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Matrix rank: 2\n", "Matrix inverse: \n" ] }, { "data": { "text/html": [ "
 0.869565
-0.434783
-0.608696
 1.304348
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Eigen values: \n" ] }, { "data": { "text/html": [ "
 1.892262+0.i
 0.607738+0.i
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "std::cout << \"Matrix rank: \" << xt::linalg::matrix_rank(M) << std::endl;\n", "std::cout << \"Matrix inverse: \" << std::endl;\n", "xcpp::display(xt::linalg::inv(M));\n", "std::cout << \"Eigen values: \" << std::endl;\n", "xcpp::display(xt::linalg::eigvals(M));" ] }, { "cell_type": "code", "execution_count": 10, "id": "d8e9e9e7-5def-4d77-b459-afb8002282ae", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3.300000, 7.700000, 12.100000, 16.500000)\n" ] } ], "source": [ "#include \n", "\n", "namespace xs = xsimd;\n", "\n", "// Define two SIMD float vectors using the wasm backend\n", "xs::batch X = {1.2f, 3.4f, 5.6f, 7.8f};\n", "xs::batch Y = {2.1f, 4.3f, 6.5f, 8.7f};\n", "\n", "// Perform SIMD addition\n", "xs::batch Z = X + Y;\n", "\n", "// Print the result\n", "std::cout << Z << std::endl;" ] }, { "cell_type": "markdown", "id": "0f0978c4-7ec4-4615-894a-c6558503d851", "metadata": {}, "source": [ "## Miscallaneous\n", "\n", "Feel free to explore other useful C++ libraries in the browser, like nlohmann_json, pugixml, xtl etc" ] }, { "cell_type": "code", "execution_count": 11, "id": "2ce27d4d-43f7-464c-a611-5400c3cdb735", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [ "#include \"nlohmann/json.hpp\"\n", "\n", "nlohmann::json jsonObject;\n", "\n", "jsonObject[\"name\"] = \"John Doe\";\n", "jsonObject[\"age\"] = 30;\n", "jsonObject[\"is_student\"] = false;\n", "jsonObject[\"skills\"] = {\"C++\", \"Python\", \"JavaScript\"};\n", "\n", "std::cout << jsonObject.dump(4) << std::endl;" ] }, { "cell_type": "code", "execution_count": 12, "id": "36b1b0f7-00d9-47bf-8543-985e27088d07", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 13, "id": "b2647bb5-0c2e-4f12-b0ed-0c0f5c7ed65c", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "07f19b34aac74f97947e4e9b068ebe5f", "version_major": 2, "version_minor": 1 }, "text/plain": [ "A Jupyter widget with unique id: 07f19b34aac74f97947e4e9b068ebe5f" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [] }, { "cell_type": "code", "execution_count": 14, "id": "0f3e4dcb-5d9f-479b-b568-8d7625683946", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 15, "id": "1eed2b39-b632-440c-9d3d-c8d377bc504c", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 16, "id": "4d1797e5-3ce1-4737-9561-a87a7e82cce1", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e34c45cc453240cebac33426cd7c448d", "version_major": 2, "version_minor": 1 }, "text/plain": [ "A Jupyter widget with unique id: e34c45cc453240cebac33426cd7c448d" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [] }, { "cell_type": "markdown", "id": "d26a70d2-9dc6-4ca0-b974-2cfd4249a8a7", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 17, "id": "e1fdb4b5-384a-42a1-80c1-ba2bcd515e01", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{\n", " \"age\": 30,\n", " \"is_student\": false,\n", " \"name\": \"John Doe\",\n", " \"skills\": [\n", " \"C++\",\n", " \"Python\",\n", " \"JavaScript\"\n", " ]\n", "}\n" ] } ], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ed69c0cd-c65a-47d7-9ee2-13502953e876", "metadata": { "trusted": true, "vscode": { "languageId": "c++" } }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "C++23", "language": "cpp", "name": "xcpp23" }, "language_info": { "codemirror_mode": "text/x-c++src", "file_extension": ".cpp", "mimetype": "text/x-c++src", "name": "C++", "version": "23" } }, "nbformat": 4, "nbformat_minor": 5 }