LpSolveDotNet 4.0.1-nuget-improvements.1

This is a prerelease version of LpSolveDotNet.
This package has a SemVer 2.0.0 package version: 4.0.1-nuget-improvements.1+21.

Requires NuGet 2.5 or higher.

dotnet add package LpSolveDotNet --version 4.0.1-nuget-improvements.1
                    
NuGet\Install-Package LpSolveDotNet -Version 4.0.1-nuget-improvements.1
                    
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="LpSolveDotNet" Version="4.0.1-nuget-improvements.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="LpSolveDotNet" Version="4.0.1-nuget-improvements.1" />
                    
Directory.Packages.props
<PackageReference Include="LpSolveDotNet" />
                    
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 LpSolveDotNet --version 4.0.1-nuget-improvements.1
                    
#r "nuget: LpSolveDotNet, 4.0.1-nuget-improvements.1"
                    
#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 LpSolveDotNet@4.0.1-nuget-improvements.1
                    
#: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=LpSolveDotNet&version=4.0.1-nuget-improvements.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=LpSolveDotNet&version=4.0.1-nuget-improvements.1&prerelease
                    
Install as a Cake Tool

LpSolveDotNet

CI

LpSolveDotNet is a .NET wrapper for the Mixed Integer Linear Programming (MILP) solver lp_solve which is itself written in C.

LpSolveDotNet works on a wide variety of .NET implementations and platforms:

Supported
.NET Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10, future
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1, future
.NET Standard 1.5, 1.6, 2.0, 2.1
OS / Architecture Windows x86 and x64, Unix x86 and x64, OSX x86 and others (for others you need to build lp_solve yourself)

How to Use - Short Version

Here is the short version, see long version below for more details.

In your project file, add platform-specific package for your platform to your project:

<PackageReference Include="LpSolveDotNet.Native.win-x64" Version="4.0.0"/>

In your code (error-handling ommitted for brevity):

// Call once per process, before any other usage of LpSolve
LpSolve.Init();

// We build a model with 3 constraints and 2 variables
const int Ncol = 2;
using var lp = LpSolve.make_lp(3, Ncol);

// NOTE: set_obj_fnex/add_constraintex should be preferred on set_obj_fn/add_constraint
//       as they can specify only non-zero elements when working with big model.
//       The methods without _ex_ suffix will ignore the first array element so
//       let's use a constant for this for clarity.
const double Ignored = 0;

// set the objective function: maximize (143 x + 60 y)
lp.set_maxim();
lp.set_obj_fn(new double[] { Ignored, 143, 60 });

// add constraints to the model
//   120 x + 210 y <= 15000
//   110 x +  30 y <= 4000
//       x +     y <= 75
lp.set_add_rowmode(true);
lp.add_constraint( new double[] { Ignored, 120, 210 }, lpsolve_constr_types.LE, 15000);
lp.add_constraint( new double[] { Ignored, 110, 30 }, lpsolve_constr_types.LE, 4000);
lp.add_constraint( new double[] { Ignored, 1, 1 }, lpsolve_constr_types.LE, 75);
lp.set_add_rowmode(false);

// We only want to see important messages on screen while solving
lp.set_verbose(lpsolve_verbosity.IMPORTANT);

// Now let lp_solve calculate a solution
lpsolve_return s = lp.solve();
if (s == lpsolve_return.OPTIMAL)
{
   Console.WriteLine("Objective value: " + lp.get_objective());

   var results = new double[Ncol];
   lp.get_variables(results);
   for (int j = 0; j < Ncol; j++)
   {
      Console.WriteLine(lp.get_col_name(j + 1) + ": " + results[j]);
   }
}

How to Use - Long Version

Library Initialization

Before LpSolveDotNet can be used, it needs to be initialized properly so it loads the native library of lp_solve for your platform.

Standard Usage

Find the package name for your target platform(s) in the table below and add it (them) to your project. The LpSolveDotNet.Native.??? packages, which reference the LpSolveDotNet package, will not only add the .NET wrapper of the lp_solve library, it will also take care of copying the native library to your build output.

OS Architecture Package to reference Notes
Windows x64 LpSolveDotNet.Native.win-x64
Windows x86 (or 32 bit on x64) LpSolveDotNet.Native.win-x86
Linux x64 LpSolveDotNet.Native.linux-x64
Linux x86 LpSolveDotNet.Native.linux-x86
OSX x86 LpSolveDotNet.Native.osx-x86 This is the last version with this package as the more recent lp_solve libraries were not built in that platform. You can still use LpSolveDotNet by following Other OS / Architectures below
Others Others LpSolveDotNet See Other OS / Architectures below
Other OS / Architectures

If your application runs on an OS / Architecture that is not listed above, you need to do the following:

  1. Build lp_solve for your OS / Architecture combination.
  2. Deploy the built native library alongside your application
  3. If your application does not load lp_solve properly, you may need to look at Other .NET Targets section for further instructions.
  4. If you did not put the native library in a folder in the paths searched by the .NET implementation, tweak the arguments you pass to LpSolveDotNet.LpSolve.Init() when you call it to match your case.
Other .NET Targets

If building your application resolves to use LpSolveDotNet's .NET Stantards targets (with an app targeting .NET Core earlier than 3.0, Xamarin...), the library will not pick up the native library by itself. The different ways to fix this are (pick one):

  1. Using property LpSolveDotNet.LpSolve.CustomLoadNativeLibrary
    1. Create a method that takes in a file path and enables your .NET implementation to load it
    2. Assign this method to the property LpSolveDotNet.LpSolve.CustomLoadNativeLibrary
  2. Placing the native library in a folder in the paths searched by the .NET implementation. This could also be what your method LpSolveDotNet.LpSolve.CustomLoadNativeLibrary is doing.
  3. Tweak the arguments you pass to LpSolveDotNet.LpSolve.Init() when you call it to match your case.
Complete the initialization

To complete the initialization from previous steps, your code must call once the LpSolveDotNet.LpSolve.Init() method. This will ensure that the right native library is loaded and called.

Using the library

  1. Use one of the factory methods on LpSolve class to create an LpSolve instance:
    • make_lp
    • read_LP
    • read_MPS
    • read_XLI
  2. Place the returned LpSolve instance into a using statement so it is properly disposed of when done with it.
  3. Use methods on that instance like the example in How to Use - Short Version or those in the Demo project.

More documentation

In a future version, the API will be more idiomatic to .NET instead of looking like C. Don't worry, we'll keep backwards compatibility so your existing code will continue to compile as-is.

Examples

You can see examples in the Demo project translated from lpsolve's original C# samples.

Feedback

LpSolve is released as open source under the LGPL-2.1 license. Bug reports and contributions are welcome at the GitHub repository.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  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 was computed.  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. 
.NET Core netcoreapp1.0 was computed.  netcoreapp1.1 was computed.  netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 is compatible.  netcoreapp3.1 was computed. 
.NET Standard netstandard1.5 is compatible.  netstandard1.6 was computed.  netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net20 is compatible.  net35 was computed.  net40 is compatible.  net403 was computed.  net45 was computed.  net451 was computed.  net452 was computed.  net46 was computed.  net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 is compatible.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen30 was computed.  tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETCoreApp 3.0

    • No dependencies.
  • .NETFramework 2.0

    • No dependencies.
  • .NETFramework 4.0

    • No dependencies.
  • .NETFramework 4.7.1

    • No dependencies.
  • .NETStandard 1.5

  • .NETStandard 2.0

    • No dependencies.

NuGet packages (6)

Showing the top 5 NuGet packages that depend on LpSolveDotNet:

Package Downloads
LpSolveDotNet.Native.win-x64

'LpSolveDotNet.Native.win-x64' and its dependency 'LpSolveDotNet' allow running the Mixed Integer Linear Programming (MILP) solver 'lp_solve' in .NET. That can solve pure linear, (mixed) integer/binary, semi-continuous and special ordered sets (SOS) models. This package specifically targets platform 'win-x64'. You can find other 'LpSolveDotNet.Native.*' packages to run on other platforms (you can target multiple platforms at the same time). Another option would be to bring your own native library and allow 'LpSolveDotNet' to find it at runtime.

LpSolveDotNet.Native.linux-x64

'LpSolveDotNet.Native.linux-x64' and its dependency 'LpSolveDotNet' allow running the Mixed Integer Linear Programming (MILP) solver 'lp_solve' in .NET. That can solve pure linear, (mixed) integer/binary, semi-continuous and special ordered sets (SOS) models. This package specifically targets platform 'linux-x64'. You can find other 'LpSolveDotNet.Native.*' packages to run on other platforms (you can target multiple platforms at the same time). Another option would be to bring your own native library and allow 'LpSolveDotNet' to find it at runtime.

LpSolveDotNet.Native.win-x86

'LpSolveDotNet.Native.win-x86' and its dependency 'LpSolveDotNet' allow running the Mixed Integer Linear Programming (MILP) solver 'lp_solve' in .NET. That can solve pure linear, (mixed) integer/binary, semi-continuous and special ordered sets (SOS) models. This package specifically targets platform 'win-x86'. You can find other 'LpSolveDotNet.Native.*' packages to run on other platforms (you can target multiple platforms at the same time). Another option would be to bring your own native library and allow 'LpSolveDotNet' to find it at runtime.

LpSolveDotNet.Native.osx-x86

'LpSolveDotNet.Native.osx-x86' and its dependency 'LpSolveDotNet' allow running the Mixed Integer Linear Programming (MILP) solver 'lp_solve' in .NET. That can solve pure linear, (mixed) integer/binary, semi-continuous and special ordered sets (SOS) models. This package specifically targets platform 'osx-x86'. You can find other 'LpSolveDotNet.Native.*' packages to run on other platforms (you can target multiple platforms at the same time). Another option would be to bring your own native library and allow 'LpSolveDotNet' to find it at runtime.

LpSolveMilpSolver

Basic implementation of MilpManager using LpSolve.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.1-nuget-improvements.1 7 8/24/2025
4.0.1-ci-fix-github-actions.1 11 8/22/2025
4.0.0 118,890 2/20/2020
3.1.0 12,179 5/25/2018
3.0.1 12,739 7/22/2016
3.0.0 1,336 5/31/2016
2.0.1 1,305 7/22/2016
2.0.0 1,282 4/29/2016
1.0.0 1,403 4/1/2016

Complete release notes can be found at https://github.com/MarcelGosselin/LpSolveDotNet/blob/master/ReleaseNotes.md
     This release contains:
     - Issue #16: Add missing methods `set_break_numeric_accuracy`, `get_break_numeric_accuracy` and `get_accuracy`.