DeepSharp.Charts 0.5.0

dotnet add package DeepSharp.Charts --version 0.5.0
                    
NuGet\Install-Package DeepSharp.Charts -Version 0.5.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DeepSharp.Charts" Version="0.5.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeepSharp.Charts" Version="0.5.0" />
                    
Directory.Packages.props
<PackageReference Include="DeepSharp.Charts" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DeepSharp.Charts --version 0.5.0
                    
#r "nuget: DeepSharp.Charts, 0.5.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DeepSharp.Charts@0.5.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DeepSharp.Charts&version=0.5.0
                    
Install as a Cake Addin
#tool nuget:?package=DeepSharp.Charts&version=0.5.0
                    
Install as a Cake Tool

<img src="https://raw.githubusercontent.com/xkqg/DeepSharp/main/assets/icon.png" width="96" align="right" alt="" />

DeepSharp — deep learning in C#

CI NuGet NuGet Downloads License: MIT GitHub stars

The best of three worlds: TensorFlow's way of describing a network, PyTorch's way of running it, and ML.NET's way of learning from a table.

DeepSharp is the C# layer over the engines that already exist: you describe, train and use a network in C#, and the arithmetic runs on .NET's own vector maths out of the box or on libtorch, the engine under PyTorch, through TorchSharp — swapping between them does not change a line of your model. What it adds is everything around the engine: getting your data in, the layers, the training loop, the checkpoints and the pictures. And a table that a tree learns better than a network does not have to become a network: the same prepared data is meant for ML.NET's trainers too.

0.5.0 learns on the engine you choose, and reads what others trained. A network trains, is measured by its pipeline's report and serves on the light engine DeepSharp ships or on libtorch, on the processor or a graphics card, without a line of it changing; and a model PyTorch, Keras or an ONNX exporter saved is read into the same network, to serve, to measure or to train further. The pipeline reads Parquet files, Excel workbooks and JSON files as it reads a comma-separated one, and runs for the learner that learns from it, saying which steps that learner does without. Beneath them stands what came before: layers, losses and optimizers; a training loop that stops once the validation rows no longer improve; networks described in Keras's words or written as code, saved with their pipeline as one file; the pipeline's report and the charts; tensors whose gradients are worked out automatically, the data half — which proposes what each column holds and names what should not be there — and a notebook to see the data in, whose report block draws what the cell that trains a model hands back. The roadmap says what comes next, and the changelog records what each release added.

dotnet add package DeepSharp
dotnet add package DeepSharp.Pipelines
dotnet add package DeepSharp.Learners.Networks
using DeepSharp.Learners.Networks;
using DeepSharp.Networks;
using DeepSharp.Pipelines;

var prepared = Pdd.Create()
    .ReadCsv("btceur-1d.csv")                                // declared, not opened
    .Declare(schema => schema
        .Timestamp("timestamp")
        .Number("close")
        .Optional("trades", ColumnKind.Number))              // a column that may have gaps
    .OrderBy("timestamp")
    .SplitByTime("timestamp", train: 0.70, validation: 0.15, gap: 1) // test is the rest
    .Ahead("close", 1, AheadAs.Return)                       // the answer: tomorrow's return
    .FillMissing("trades", With.Mean)                        // only offered after the split
    .Normalise("close", Scale.MidRange)                      // the training rows land between -1 and 1
    .Normalise("trades", Scale.MidRange)
    .Drop("timestamp")
    .Report(report => report.Measure(Metric.Rmse).On(Part.Validation, Part.Test).As(Shown.Numbers))
    .Build()
    .Run();

var trained = new Sequential().Dense(8).Relu().Dense(1)     // Keras's words: the widths come from the rows
    .Compile(new Adam(), new MeanSquaredError())
    .Fit(prepared, new FitOptions(seed: 42) { Epochs = 20 });

var file = trained.ToJson();                                 // the network and its pipeline, one file

btceur-1d.csv is a file of your own, and none ships here: a day a row of bitcoin's price in euros, as an exchange exports its daily candles, under a header that names timestamp, close and trades — when the day starts, the price it closed at, and how many trades it saw, empty on a day the exchange did not count them. The samples below run the same verbs on published data.

The course from raw data to a validated model is declared once as an artefact and replayed, and anything that learns from the data is fitted on the training rows alone. That is the whole idea, and PDD is where it is explained.

The network learns from the training rows and is judged by the validation rows; the test rows reach it only when the report measures it, each measure beside what predicting the training rows' average would score. trained.Predict(rows) answers rows that arrive later in the answer's own units — here, a return comes back as a price — and its Unfamiliar names, for each row, the features it moves away from the one value every training row held there, which the network learned nothing about; the report counts such rows in each part it measures. TrainedNetwork.FromJson(file, NetworkCatalog.BuiltIn(), StepCatalog.BuiltIn()) reads the network and its pipeline back in a program that has never seen the data, refusing the network beside any other fit of its pipeline, however alike their columns are. DeepSharp.Charts draws the loss curve, the measures and a confusion matrix, as SVG, and trained.Measures!.Report() renders the whole report as HTML.

The steps and what they learned are one file: prepared.ToJson() writes it, and PreparedData.FromJson(text, StepCatalog.BuiltIn()) reads it back in a program that has never seen the data. The catalog is the list of verbs the reader knows — add .WithIndicators() for a file that holds indicators, which read the rows in their order and so need that order said first, with .OrderBy("timestamp"); and .WithParquet(), .WithExcel() or .WithJson() for one that reads its rows with those packages' readers.

Reading the data, and running it for the learner

.ReadCsv(path) is one of four readers of a file. DeepSharp.Pipelines.Parquet adds .ReadParquet(path), DeepSharp.Pipelines.Excel adds .ReadExcel(path) and .ReadExcel(path, sheet), and DeepSharp.Pipelines.Json adds .ReadJson(path), for an array of records as an API hands them back; each is a verb of the pipeline's file as well, replayed as the comma-separated file is, and the Titanic passenger list in each of the four formats gives the same rows under the same keys in the same parts. DeepSharp.Pipelines.DataFrame reads Microsoft's data frame, and through it a database query. A Parquet file and a database say what each column holds, and the proposal of kinds takes what they say.

A pipeline runs for the learner that learns from it. Needs says what that learner needs of its features: pipeline.RunFor(Needs.NoScale) leaves out a step that only scales a feature, for a tree indifferent to scale, and RunFor(Needs.Categories) also hands each category over as its place in the list the training rows held, for a learner that splits on categories itself. A step an answer's way back runs through, one whose column a step below reads, and a scale that refuses what it was not fitted on are always taken. PreparedData.Skipped names what a run left out, and its file writes it, so a replay leaves out the same. On the wiki's Titanic pipeline a run for Categories hands a passenger over as nine numbers where the network's run hands over fourteen, and the report measures both learners on the same 623, 133 and 135 rows. Run() takes every step, as it always did, and a learner is handed only a run it can take.

On the engine you choose

The arithmetic runs on the light engine DeepSharp ships unless you name another, and naming it is one line: new FitOptions(seed: 42) { Backend = engine } trains the network on it, judges it by the validation rows and takes the report's measures there, and trained.Predict(rows, engine) serves on it. DeepSharp.Backends.TorchSharp is that engine on libtorch — TorchBackend.OnCpu() on the processor, TorchBackend.OnGpu(0) on the first graphics card:

dotnet add package DeepSharp.Backends.TorchSharp
dotnet add package libtorch-cpu-win-x64 --version 2.10.0

The package brings TorchSharp 0.107.0 and nothing native, so your application brings libtorch: libtorch-cpu-win-x64, libtorch-cpu-linux-x64 or libtorch-cpu-osx-arm64 2.10.0 for the processor, TorchSharp-cpu for all three, or TorchSharp-cuda-windows or TorchSharp-cuda-linux 0.107.0 for an NVIDIA card; made where there is none, the engine names those packages. The processor's libtorch is 56.9 MB to 128.2 MB to download, depending on the platform, and a card's runs to gigabytes, which is why no package of DeepSharp's brings it.

Which engine is the faster depends on the size of the work. Measured side by side on one machine, a Titanic training step took 38.8 µs on the light engine and 336 µs on libtorch, which spends longer handing each small operation over than the operation takes; a step of a small convolution took 12.1 ms on the light engine and 3.5 ms on libtorch on one thread, 2.2 on sixteen; and a convolution over 256 images with 32 filters took 345 ms on the light engine, 27.5 on libtorch on the processor and 5.0 on an RTX 5070 Ti. Every engine is held to the light one operation by operation and step by step — a total within three roundings of the size of its terms — and not run by run, since two engines that add up in another order drift apart over many steps: the networks sample's Titanic run kept the same epoch and got the same 0.815 of the test passengers right on all three, and ended with weights 0.08 from the light engine's on libtorch's processor and 2.4e−7 from them on the card. The network holds no engine and its file names none, so a network trained on one engine is served on another; network.Predict(features, loss, engine) is the one evaluation every door answers rows through.

Checkpoints are taken every epoch, or only when the validation loss improves, and CheckpointFile.Write(compiled, prepared, checkpoint) writes one as the network's file with what its run needs to go on. It records what the run went under — the seed, the batch size, the early stopping, and the engine with the version and the device an engine that implements INamesItsVersionAndDevice names — and a run that goes on from it under anything else is refused before anything is put back, naming each difference: on the engine it was taken on, a run goes on to the bit, and on another it would be another run under the same seed. CheckpointFile.Read(text, NetworkCatalog.BuiltIn(), prepared) reads one back in one reading of its file, holding it to its pipeline, and NetworkDocument.ReadCheckpoint reads one kept under keys of your own. The one file holds a network of up to about 45 million parameters, and a checkpoint under Adam one of about 14 million; a network's file is read at 36 bytes a parameter, a checkpoint under Adam at 96.

Reading what others trained

network.Load(entries) puts numbers trained somewhere else into a network by the path of each slot — 1.weight, 1.running_mean — all of them or none, as PyTorch's load_state_dict does with strict=True, every fault named at once in a SlotLoadException. IImporter is the seam a reader of another framework's files implements, and three packages implement it, each handing back a SavedNetwork — the network and the loss it answers through:

using DeepSharp.Import.Keras;
using DeepSharp.Import.Onnx;
using DeepSharp.Import.PyTorch;
using DeepSharp.Networks;
using DeepSharp.Tensors;

using var keras = File.OpenRead("titanic.keras");
var described = new KerasFile().Read(keras);                         // the network its file describes, and its loss

using var graph = File.OpenRead("titanic.onnx");
var exported = new OnnxFile(new BinaryCrossEntropy()).Read(graph);  // a graph names no loss, so it is handed one

using var state = File.OpenRead("titanic.pt");
var network = new Sequential().Dense(16).Relu().Dense(1).Lower(new Shape(14), new RandomStream(7));
var numbers = new TorchSaveFile(network, new BinaryCrossEntropy()).Read(state);   // numbers alone, into a network written here

DeepSharp.Import.Keras reads the .keras archive Keras 3 saves a model to and the .h5 file it saved one to before; DeepSharp.Import.Onnx the graphs torch.onnx.export, Keras's model.export(format="onnx") and tf2onnx write; DeepSharp.Import.PyTorch a safetensors file, SafetensorsFile, or the file torch.save(model.state_dict(), file) writes, TorchSaveFile. Each number is turned into the layout its slot keeps, as the layer that holds it says. The Titanic network PyTorch trained answers the 135 test passengers within five roundings of a single-precision number of PyTorch's chances, from a safetensors file, a .pt file or either exporter's graph, and the one Keras trained within five of Keras's from its archive, its HDF5 file or its graph; what no network here is built of — pooling, a branch, a dilated window — is refused at the layer or the node that says it, every one at once. The pickle torch.save writes is a program, so it is read by an interpreter that carries out only what PyTorch's own weights-only reader carries out, and builds nothing a file names but what a state dictionary is made of: any other name is refused where the file names it, before anything is looked up, built or run. A model read so is trained further behind a pipeline as any network is — described.Network.Compile(new Adam(0.001), described.Loss).Fit(prepared, options) — and kept with that pipeline as the one file.

Samples

Two programs and a notebook in Samples run all of this on published data, and a test runs each as it stands:

dotnet run --project Samples/DeepSharp.Sample.Pipelines -c Release -f net10.0
dotnet run --project Samples/DeepSharp.Sample.Networks -c Release -f net10.0

The first asks the Titanic passenger list what each of its columns holds before anything is declared, has a profile say what should not be there and how each is answered, and prepares the passengers and a price series. The second trains a network on each of three datasets — whether a passenger survived, a price five days on, a day's bikes hour by hour — has each pipeline's report measure it, saves it as its one file, reads it back and serves a row, and writes its charts. The notebook, Samples/titanic.verso, writes the Titanic pipeline block by block; its C# cell trains a network on what the blocks hand over, and its report block then draws the measures.

A notebook to see it in

DeepSharp.Verso.Notebooks writes the same pipeline as a Verso notebook, one block per step, each block the step's own JSON — edited as text, or field by field in Verso's properties panel. The first block reads the rows from a comma-separated file, a Parquet file, a sheet of an Excel workbook or a JSON file: the notebook brings those readers with it, as it brings the indicators and the charts. "Show the data here" on a block runs the pipeline down to it and shows the rows there, each column coloured over the training rows and every row marked with the part it lands in. A box on the grid leaves a column out — it turns black — or makes it a category, and the notebook writes the step that does it. "Choose the columns" lists every column of the source with its first values and what its cells propose it holds: tick it in, and it comes in so, or out; pick its kind, make it the answer and set the answer's own values — or tick a range, and seventy bands of a flock are taken in, or made the answer, with two ticks. A profile under a block names what should not be there, and where the answer is a change to the columns — a column that hands a model the answer left out, a fare of 0 said to stand for a gap — a box beside it makes it. What the blocks decide about their columns is saved beside the notebook, and the toolbar takes a saved file over again, listing every change before it makes one and every saved decision it cannot make. It also runs the whole pipeline and exports it as the same file the chain writes, and where a notebook comes back from Jupyter or Markdown with its blocks as text — as Verso's browser editor opens such a file — it makes blocks of them again.

Install it from Verso's Extensions panel with the notebook open: Verso loads a package installed there for a notebook that names it among the extensions it needs, and installing it into the open notebook writes that notebook's name for it, so it is loaded there from then on — install it the same way into each notebook that does not name it yet, the sample among them. The same package runs in Verso's VS Code extension, in the browser editor verso serve opens, and inside an application of your own, through DeepSharp.Verso.Api — the Notebook page says what each needs. Or let DeepSharp's own server show it in your browser, with nothing else to install — here the sample, from the repository's folder:

dotnet tool install --global DeepSharp.Verso.Serve
deepsharp-serve Samples/titanic.verso

It listens on this computer alone and answers only the address it prints, token and all.

A C# cell in the same notebook reads what the blocks declare, as text — it is there after "Show the data here" or the toolbar's run, and taken back whenever the blocks may no longer make it. The cell reads it through a catalog that knows every verb a block can hold, so it brings the packages the notebook brings:

#r "nuget: DeepSharp.Pipelines.Indicators"
#r "nuget: DeepSharp.Pipelines.Parquet"
#r "nuget: DeepSharp.Pipelines.Excel"
#r "nuget: DeepSharp.Pipelines.Json"
using DeepSharp.Pipelines;

if (Variables.TryGet<string>("deepsharp.pipeline", out var text))
{
    var folder = Variables.TryGet<string>("deepsharp.folder", out var saved) ? SourceFolder.Of(saved) : SourceFolder.WorkingDirectory;
    var catalog = StepCatalog.BuiltIn().WithIndicators().WithParquet().WithExcel().WithJson();
    var declaration = PipelineDeclaration.FromJson(text, catalog);
    var prepared = new Pipeline(declaration, rows: null, folder).Run();
}

The notebook trains nothing, so a report block's measures come from the cell that trains a model: it hands back what the report measured, Variables.Set("deepsharp.predictions", trained.Measures!.PredictionsToJson()), and "Show the data here" at the report block measures those predictions on the notebook's own run of its blocks and draws them as the report says, refusing predictions made behind any other fit — a block edited since the cell ran, say — with the words to run the cell again. A cell that ends with trained.Measures!.Report() shows the same report, and one that ends with trained.History!.LossCurve() the loss curve.

Read on

Getting started Install it, add two tensors, prepare a real file, train a network on it.
PDD The idea this library is built around, and the mistake it removes.
Pipeline Every verb in the order you write it: readers, features, the split, gaps, scales, what a model is asked to predict, the handover, and a run for each learner.
Networks Layers, losses, optimizers and the loop; a network in Keras's words or as code; trained behind a pipeline, measured, drawn and saved as one file.
TorchSharp backend The engine on libtorch: what your application brings, what the engine is held to, and when it is the faster.
Importing a model A model PyTorch, Keras or an ONNX exporter saved, read into the same network: what each reader reads, and what it refuses.
Notebook A pipeline written block by block in Verso, and the data at any block.
Architecture The design decisions, and what was deliberately left out.
Next to TorchSharp, TensorFlow.NET and ML.NET What those give you, what they do not, why the choice of engine stays a choice, and where a trainer from ML.NET fits.
Quality What has to be true before anything is allowed in.
Roadmap What is next, and in which order.
Contributing A failing test first, no warnings, a coverage check that fails rather than reports.
Security What counts as a vulnerability here, and how to report one.

The packages

DeepSharp The tensors, their shape and the storage their values live on, the seam the arithmetic runs behind, what every engine refuses, the light engine on .NET's own vector maths, and the gradients worked out through it; the layers — dense, activations, dropout, normalisations, convolution, its window padded as TensorFlow's 'same' if you say so — networks written as code or described in Keras's words, losses, optimizers and learning-rate schedules, the training loop with early stopping and checkpoints, a network written down as the kinds it is made of and the numbers it learned, and the load that puts numbers trained elsewhere into its slots. Brings System.Numerics.Tensors alone.
DeepSharp.Pipelines The data half: readers and the kind each column's cells propose, features, the split, gaps, scales, a profile that names what should not be there, the answer in four kinds, the report of what a trained model is measured by, the handover — a run for each learner, and every feature declared to land between minus one and one for a learner that needs it — and the column decisions saved on their own and taken over — saved as a file and replayed. Knows no tensor, and brings nothing but Microsoft's dependency-injection abstractions.
DeepSharp.Pipelines.Parquet .ReadParquet(path): an Apache Parquet file, which says what each of its columns holds. Brings Parquet.Net 6.1.0 and the compression libraries it reads with.
DeepSharp.Pipelines.Excel .ReadExcel(path) and .ReadExcel(path, sheet): a sheet of an .xlsx, .xls or .xlsb workbook, each cell as the sheet types it. Brings ExcelDataReader 3.9.0.
DeepSharp.Pipelines.Json .ReadJson(path): a JSON file holding an array of records, each value as the file writes it. Brings nothing: .NET reads JSON itself.
DeepSharp.Pipelines.DataFrame One reader for the long tail: a CSV, a database query, rows already in hand — anything that fills Microsoft's DataFrame, Microsoft.Data.Analysis, reached through MatPlotLibNet.DataFrame. A CSV comes through as the text the file writes, and a query with the kinds the database gives its columns.
DeepSharp.Pipelines.Indicators Twelve indicators over a series as pipeline verbs, the arithmetic borrowed from MatPlotLibNet rather than written again.
DeepSharp.Learners.Networks Where a network meets a pipeline: trained on its training rows, judged by its validation rows, measured by its report, and saved with it as one file that refuses any other fit of it; what it predicts for rows served later comes back in the answer's own units, on whichever engine it is handed, naming what each row holds that the network learned nothing about; and a checkpoint is the same file with what the run needs to go on, refused to a run under another seed, batch size, early stopping or engine. Brings the two packages it joins.
DeepSharp.Backends.TorchSharp The arithmetic on libtorch, on the processor or a graphics card: TorchBackend.OnCpu() or TorchBackend.OnGpu(0), held to the same contract as the light engine, operation by operation. Brings TorchSharp 0.107.0; the application brings the libtorch it runs on.
DeepSharp.Import.PyTorch A network PyTorch trained, read into the same network written here: a safetensors file, or the .pt file torch.save(model.state_dict(), file) writes, its pickle read as PyTorch's weights-only reader reads it. Brings Onnxify.Safetensors 0.3.11, a port of safetensors' own reader.
DeepSharp.Import.Keras A model Keras 3 saved, as a .keras archive or an .h5 file, read into a network built in Keras's words. Brings PureHDF 2.2.0, a managed HDF5 reader.
DeepSharp.Import.Onnx An ONNX graph — PyTorch's, Keras's or tf2onnx's — lowered onto the layers it is. Brings OnnxSharp 0.3.2 and the Google.Protobuf 3.29.3 it reads with.
DeepSharp.Charts The charts, as SVG, drawn with MatPlotLibNet from what the training loop and the measures already keep: the loss curve, the learning rate, a confusion matrix, what was predicted against what was there, what was left over, every measure as bars beside the training rows' average, and a correlation as a heatmap; and the report, rendered once as HTML.
DeepSharp.Verso.Notebooks A pipeline written as a Verso notebook, one block per step, the first reading a comma-separated, Parquet, Excel or JSON file, with the data, a profile and a heatmap at any block, and its columns chosen from the grid or a list — which shows what each column's cells propose — and saved beside it; a box beside a profile's alert gives its answer, and a report block draws the measures a C# cell hands back. It brings the charts, the indicators and the three readers, keeps a notebook of blocks in .verso, and makes blocks again of the steps another format kept as text. It runs in Verso's VS Code extension, in verso serve, in DeepSharp's own server and in an application of your own.
DeepSharp.Verso.Api An application of your own hosting the notebook: one open notebook for each file, however many views show it, with the notebook's parts registered by the package itself — so a program published as a single file has them too. Typing, running, a click on a block's controls and the toolbar's buttons take their turn one at a time; a cell is added after another or at the end, of any kind the engine has, taken away, moved past its neighbour or turned into another kind, each only where the notebook's layout allows it; as a cell's text is typed, its kernel offers what may come next and says what a word means, even while a run is under way; a new notebook is made as one block that reads a CSV file, never over a file that is there already; a run can be stopped, one that never ends or one that still waits for another notebook's C# run, a file a button hands over goes to whoever pressed it, the properties panel comes back field by field, the layout, the theme and the title are changed as Verso's editors change them, and what a person does to the dashboard's tiles goes to the layout's own part. The notebook opens and saves as Verso's browser editor does, writing nothing into it that the engine only falls back on; every view is told what changed, version by version — the cells, the run under way and what runs that no run owns, the toolbar, whether anything is unsaved, what became of the kernels, what the dashboard or the presentation draws, and what the notebook says of itself; a notebook no view shows can close by itself when nothing in it is unsaved, a close stops the run under way instead of waiting for it, and the cells, and what they show, come back as plain values. Brings Verso's engine, 1.2.2.
DeepSharp.Verso.Serve DeepSharp's own server: deepsharp-serve, a .NET tool, shows a notebook or a folder of them in your browser, on Verso's engine and built on DeepSharp.Verso.Api, with nothing else to install. It listens on this computer alone, answers only the address it prints, makes a change only for its own page, and writes into its folder only the notebooks it serves, what they save beside themselves, and a new notebook a page asks for, never over a file that is there; Ctrl+C ends it at once, whatever a notebook runs. Its page does what Verso's editor does, over one connection a tab, and carries everything it draws with, so it fetches nothing: the blocks, failures, JSON, CSV, progress, Mermaid diagrams and KaTeX formulas drawn as Verso draws them, a widget in a sandboxed frame, the dashboard and the presentation as the engine arranges them; the Metadata, Properties and View panels; Verso's keys, and what a cell's kernel offers and what a word means as its text is typed; the kernels' status, a dot while anything is unsaved, and the Stop where Run All stood. A cell is added, taken away once you say yes, moved or turned into another kind there, where the notebook's layout allows it; a file a button hands over arrives as a download; a dropped connection comes back by itself, keeping what was typed; and a folder's page makes a new notebook.

dotnet pack DeepSharp.slnx makes all sixteen. They run on .NET 8 and .NET 10. MIT — see LICENSE; each library a package brings comes under the licence its own package states. The page deepsharp-serve serves carries Mermaid and KaTeX, each under its own MIT licence, and DOMPurify under the Apache License 2.0, and the tool's third-party notices name those and every library the tool carries — Verso and its engine, the C# compiler, NuGet's client, Markdig, and the readers' libraries — each with its version, where it comes from, its copyright and its licence.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on DeepSharp.Charts:

Package Downloads
DeepSharp.Verso.Notebooks

A DeepSharp pipeline written as a notebook in Verso, one block per step. Each block is the step's own JSON, edited as text or in Verso's properties panel, and shows the data at that point on request: a grid coloured per column over the training rows, a profile that names what should not be there and how each is answered, with a box that gives an answer which changes the columns, and a heatmap of the complete training rows. Columns are chosen from the grid or from a list of the source's columns, which says what each column's cells propose it holds, and the decisions are saved beside the notebook and taken over again. The notebook is the declaration — exported as the same pipeline file, and handed to C# cells as text. It runs in Verso's VS Code extension, in verso serve, in DeepSharp's own server deepsharp-serve and in an application of your own.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.5.0 0 10/1/2026
0.4.0 54 9/30/2026