diff --git a/ortools/fsharp/Google.sln b/ortools/fsharp/Google.sln deleted file mode 100644 index 0201c4bf13..0000000000 --- a/ortools/fsharp/Google.sln +++ /dev/null @@ -1,48 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "OrTools.FSharp", "OrTools.FSharp\OrTools.FSharp.fsproj", "{B7DC098E-1334-47D2-88D4-7DA1EF8A4076}" -EndProject -Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "OrTools.FSharp.Test", "OrTools.FSharp.Test\OrTools.FSharp.Test.fsproj", "{C3B40B0A-23B6-4629-9A45-01F52722A97D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Debug|x64.ActiveCfg = Debug|x64 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Debug|x64.Build.0 = Debug|x64 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Debug|x86.ActiveCfg = Debug|x86 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Debug|x86.Build.0 = Debug|x86 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Release|Any CPU.Build.0 = Release|Any CPU - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Release|x64.ActiveCfg = Release|x64 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Release|x64.Build.0 = Release|x64 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Release|x86.ActiveCfg = Release|x86 - {B7DC098E-1334-47D2-88D4-7DA1EF8A4076}.Release|x86.Build.0 = Release|x86 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Debug|x64.ActiveCfg = Debug|x64 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Debug|x64.Build.0 = Debug|x64 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Debug|x86.ActiveCfg = Debug|x86 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Debug|x86.Build.0 = Debug|x86 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Release|Any CPU.Build.0 = Release|Any CPU - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Release|x64.ActiveCfg = Release|x64 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Release|x64.Build.0 = Release|x64 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Release|x86.ActiveCfg = Release|x86 - {C3B40B0A-23B6-4629-9A45-01F52722A97D}.Release|x86.Build.0 = Release|x86 - EndGlobalSection -EndGlobal diff --git a/ortools/fsharp/OrTools.FSharp.Test/OrTools.FSharp.Test.fsproj b/ortools/fsharp/OrTools.FSharp.Test/OrTools.FSharp.Test.fsproj deleted file mode 100644 index 84b88602aa..0000000000 --- a/ortools/fsharp/OrTools.FSharp.Test/OrTools.FSharp.Test.fsproj +++ /dev/null @@ -1,27 +0,0 @@ - - - Exe - netcoreapp2.0 - Google.OrTools.FSharp.Test - Google.OrTools.FSharp.Test - - - full - - - - - - - - - - - - ..\..\..\bin\Google.OrTools.FSharp.dll - - - ..\..\..\bin\Google.OrTools.dll - - - diff --git a/ortools/fsharp/OrTools.FSharp.Test/Program.fs b/ortools/fsharp/OrTools.FSharp.Test/Program.fs deleted file mode 100644 index f21907b955..0000000000 --- a/ortools/fsharp/OrTools.FSharp.Test/Program.fs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Google.OrTools.FSharp - -module Program = - [] - let main _ = - printfn "Google.OrTools.FSharp Tests" - 0 diff --git a/ortools/fsharp/OrTools.FSharp.Test/Tests.fs b/ortools/fsharp/OrTools.FSharp.Test/Tests.fs deleted file mode 100644 index 492a60cbf4..0000000000 --- a/ortools/fsharp/OrTools.FSharp.Test/Tests.fs +++ /dev/null @@ -1,54 +0,0 @@ -namespace Google.OrTools.FSharp - - -module Tests = - open System - open Xunit - - open Google.OrTools.LinearSolver - open Google.OrTools.FSharp - - - [] - let ``Equality Matrix cannot be empty`` () = - try - let opts = SolverOpts.Default.Name("Equality Constraints").Goal(Minimize).Objective([2.0;1.0;0.0;0.0;0.0]).Algorithm(LP CLP) - opts |> lpSolve |> SolverSummary |> ignore - with - | Failure msg -> - Assert.Equal("Must provide at least one Matrix/Vector pair for inequality/equality contraints", msg) - - - [] - let ``Linear Solver with GLOP Solver`` () = - let svr = Solver.CreateSolver("LinearProgramming", LinearProgramming.GLOP.ToString()) - - // x1, x2 are continuous non-negative variables. - let x1 = svr.MakeNumVar(Double.NegativeInfinity, Double.PositiveInfinity, "x1") - let x2 = svr.MakeNumVar(Double.NegativeInfinity, Double.PositiveInfinity, "x2") - - // Maximize 8 * x1 + 4 * x2 - let objective = svr.Objective() - objective.SetCoefficient(x1, 8.0) - objective.SetCoefficient(x2, 4.0) - objective.SetMaximization() - - // x1 + x2 <= 10. - let c0 = svr.MakeConstraint(Double.NegativeInfinity, 10.0) - c0.SetCoefficient(x1, 1.0) - c0.SetCoefficient(x2, 1.0) - - // 5 * x1 + x2 <= 15. - let c1 = svr.MakeConstraint(Double.NegativeInfinity, 15.0) - c1.SetCoefficient(x1, 5.0) - c1.SetCoefficient(x2, 1.0) - - Assert.Equal(svr.NumVariables(), 2) - Assert.Equal(svr.NumConstraints(), 2) - - let resultStatus = svr.Solve() - - Assert.Equal(resultStatus, Solver.OPTIMAL) - Assert.Equal(svr.Objective().Value(), 45.0) - Assert.Equal(x1.SolutionValue(), 5.0/4.0) - Assert.Equal(x2.SolutionValue(), 35.0/4.0) diff --git a/ortools/fsharp/OrTools.FSharp/OrTools.FSharp.fsproj b/ortools/fsharp/OrTools.FSharp/OrTools.FSharp.fsproj deleted file mode 100644 index 915ec5657b..0000000000 --- a/ortools/fsharp/OrTools.FSharp/OrTools.FSharp.fsproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Library - Google.OrTools.FSharp - netstandard2.0;net462 - Google.OrTools.FSharp - OrTools.FSharp.nuspec - - ..\..\..\bin\or-tools.snk - true - - false - - 0.0.0.0 - 0.0.0.0 - 0.0.0.0 - - - - full - true - true - - - - - - - - - - - ..\..\..\bin\Google.OrTools.dll - - - diff --git a/ortools/fsharp/OrTools.FSharp/OrTools.FSharp.nuspec b/ortools/fsharp/OrTools.FSharp/OrTools.FSharp.nuspec deleted file mode 100644 index 71dd340ec8..0000000000 --- a/ortools/fsharp/OrTools.FSharp/OrTools.FSharp.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - - MMMM - VVVV - Google Inc. - https://github.com/google/or-tools/blob/master/LICENSE-2.0.txt - https://developers.google.com/optimization - F# wrapper for the Operations Research Tools project - Copyright 2018 Google, Inc - Operations Research Math Linear Constraint Programming F# - - - - - - - - - - - \ No newline at end of file diff --git a/ortools/fsharp/OrTools.FSharp/OrTools.fs b/ortools/fsharp/OrTools.FSharp/OrTools.fs deleted file mode 100644 index 570dba052b..0000000000 --- a/ortools/fsharp/OrTools.FSharp/OrTools.fs +++ /dev/null @@ -1,358 +0,0 @@ -namespace Google.OrTools - -module FSharp = - - open System - open Google.OrTools.Algorithms - open Google.OrTools.LinearSolver - - type Goal = - /// Maximize the Objective Function - | Maximize - /// Minimize the Objective Function - | Minimize - - /// Linear Programming Algorithm - type LinearProgramming = - /// Coin-Or (Recommended default) - | CLP - /// GNU Linear Programming Kit - | GLPK - /// Google Linear Optimization - | GLOP - /// Gurobi Optimizer - | GUROBI - /// IBM CPLEX - | CPLEX - /// Solver Name - override this.ToString() = - match this with - | CLP -> "CLP_LINEAR_PROGRAMMING" - | GLPK -> "GLPK_LINEAR_PROGRAMMING" - | GLOP -> "GLOP_LINEAR_PROGRAMMING" - | GUROBI -> "GUROBI_LINEAR_PROGRAMMING" - | CPLEX -> "CPLEX_LINEAR_PROGRAMMING" - /// Solver Id - member this.Id = - match this with - | CLP -> 0 - | GLPK -> 1 - | GLOP -> 2 - | GUROBI -> 6 - | CPLEX -> 10 - - /// Integer Programming Algoritm - type IntegerProgramming = - /// Solving Constraint Integer Programs (Recommended default) - | SCIP - /// GNU Linear Programming Kit - | GLPK - /// Coin-Or Branch and Cut - | CBC - /// Gurobi Optimizer - | GUROBI - /// IBM CPLEX - | CPLEX - /// Binary Optimizer - | BOP - /// Solver Name - override this.ToString() = - match this with - | SCIP -> "SCIP_MIXED_INTEGER_PROGRAMMING" - | GLPK -> "GLPK_MIXED_INTEGER_PROGRAMMING" - | CBC -> "CBC_MIXED_INTEGER_PROGRAMMING" - | GUROBI -> "GUROBI_MIXED_INTEGER_PROGRAMMING" - | CPLEX -> "CPLEX_MIXED_INTEGER_PROGRAMMING" - | BOP -> "BOP_INTEGER_PROGRAMMING" - /// Solver Id - member this.Id = - match this with - | SCIP -> 3 - | GLPK -> 4 - | CBC -> 5 - | GUROBI -> 7 - | CPLEX -> 11 - | BOP -> 12 - - type LinearSolverAlgorithm = - | LP of LinearProgramming - | IP of IntegerProgramming - - /// Max Flow Solver Result - type MaximumFlowResult = - | Optimal - | IntegerOverflow - | BadInput - | BadResult - member this.Id = - match this with - | Optimal -> 0 - | IntegerOverflow -> 1 - | BadInput -> 2 - | BadResult -> 3 - - /// Minimum Cost Flow Result - type MinimumCostFlowResult = - | NotSolved - | Optimal - | Feasible - | Infeasible - | Unbalanced - | BadResult - | BadCostRange - member this.Id = - match this with - | NotSolved -> 0 - | Optimal -> 1 - | Feasible -> 2 - | Infeasible -> 3 - | Unbalanced -> 4 - | BadResult -> 5 - | BadCostRange -> 6 - - - /// Knapsack Solver Algorithm - type KnapsackSolverAlgorithm = - | BruteForce - | SixtyFourItems - | DynamicProgramming - | MultidimensionCBC - | MultidimensionGLPK - | MultidimensionBranchAndBound - | MultidimensionSCIP - /// Solver Id - member this.Id = - match this with - | BruteForce -> 0 - | SixtyFourItems -> 1 - | DynamicProgramming -> 2 - | MultidimensionCBC -> 3 - | MultidimensionGLPK -> 4 - | MultidimensionBranchAndBound -> 5 - | MultidimensionSCIP -> 6 - - let knapsackSolve (name: string) (solverAlgorithm:KnapsackSolverAlgorithm) (profits:int64 list) (weights:int64 list) (capacities:int64 list) = - // extract the specific algorithm so its Id can be used to create solver - let algorithm = - match solverAlgorithm with - | MultidimensionBranchAndBound -> - MultidimensionBranchAndBound.Id - | BruteForce -> - BruteForce.Id - | SixtyFourItems -> - SixtyFourItems.Id - | DynamicProgramming -> - DynamicProgramming.Id - | MultidimensionCBC -> - MultidimensionCBC.Id - | MultidimensionGLPK -> - MultidimensionGLPK.Id - | MultidimensionSCIP -> - MultidimensionSCIP.Id - - let solver = new KnapsackSolver(algorithm, name) - - // transform lists to compatible structures for C++ Solver - let profits = new KInt64Vector( List.toArray profits ) - - let weights = - let tempVector = new KInt64VectorVector(1) - let tempWeights = new KInt64Vector(List.toArray weights) - tempVector.Add(tempWeights) - tempVector - - let capacities = new KInt64Vector (List.toArray capacities) - - solver.Init(profits, weights, capacities) - solver - - type SolverOpts = { - /// Name of the solver - SolverName: string; - /// Linear objective function vector - ObjectiveFunction: float list; - /// Matrix for linear inequality constraints - ConstraintMatrix: float list list option; - /// Upper Bound vector for linear inequality constraints - ConstraintVectorUpperBound: float list option; - /// Lower Bound vector for linear inequality constraints - ConstraintVectorLowerBound: float list option; - /// Vector of variable upper bounds - VariableUpperBound: float list; - /// Vector of variable lower bounds - VariableLowerBound: float list; - /// Matrix for linear equality constraints - ConstraintMatrixEq: float list list option; - /// Vector for linear equality constraints - ConstraintVectorEq: float list option; - /// Solver Algorithm to use - SolverAlgorithm: LinearSolverAlgorithm; - /// Solver Goal (Minimize/Maximize) - SolverGoal: Goal - } with - member this.Name(nm:string)= - {this with SolverName = nm} - member this.Objective(objVector:float list) = - {this with ObjectiveFunction = objVector} - member this.Matrix(mat:float list list) = - {this with ConstraintMatrix = Some(mat)} - member this.VectorUpperBound(vec:float list) = - {this with ConstraintVectorUpperBound = Some(vec)} - member this.VectorLowerBound(vec:float list) = - {this with ConstraintVectorLowerBound = Some(vec)} - member this.MatrixEq(mat:float list list) = - {this with ConstraintMatrixEq = Some(mat)} - member this.VectorEq(vec:float list) = - {this with ConstraintVectorEq = Some(vec)} - member this.VarUpperBound(ub:float list) = - {this with VariableUpperBound = ub} - member this.VarLowerBound(lb:float list) = - {this with VariableLowerBound = lb} - member this.Algorithm(algo:LinearSolverAlgorithm) = - {this with SolverAlgorithm = algo} - member this.Goal(goal:Goal) = - {this with SolverGoal = goal} - static member Default = - { - SolverName = "Solver"; - ObjectiveFunction = []; - ConstraintMatrix = None; - ConstraintVectorUpperBound = None; - ConstraintVectorLowerBound = None; - VariableUpperBound = []; - VariableLowerBound = []; - ConstraintMatrixEq = None; - ConstraintVectorEq = None; - SolverAlgorithm = LP CLP - SolverGoal = Maximize - } - - let lpSolve (solverOptions:SolverOpts) = - // extract the specific algorithm so its Id can be used to create solver - let algorithm = - match solverOptions.SolverAlgorithm with - | LP lp -> lp.Id - | IP ip -> ip.Id - - let solver = new Solver(solverOptions.SolverName, algorithm) - - // Detect errors on required parameters - if (solverOptions.ConstraintMatrix.IsNone && solverOptions.ConstraintVectorUpperBound.IsNone && solverOptions.ConstraintVectorLowerBound.IsNone) - && (solverOptions.ConstraintMatrixEq.IsNone && solverOptions.ConstraintVectorEq.IsNone) then - failwith "Must provide at least one Matrix/Vector pair for inequality/equality contraints" - - if solverOptions.ObjectiveFunction.IsEmpty then - failwith "Objective function cannot be empty" - - if solverOptions.VariableUpperBound.IsEmpty then - failwith "Variable upper bound values cannot be empty" - - if solverOptions.VariableLowerBound.IsEmpty then - failwith "Variable lower bound values cannot be empty" - - // check inequality matrix dimensions against bounds - match (solverOptions.ConstraintMatrix, solverOptions.ConstraintVectorLowerBound, solverOptions.ConstraintVectorUpperBound) with - | _, Some lb, Some ub when lb.Length <> ub.Length -> - failwithf "Constraint vector dimensions should be equal.\nLower Bound Length: %i\nUpper Bound Length: %i" lb.Length ub.Length - | _ -> () - - // Check Objective function dimensions with variable bounds dimensions - match (solverOptions.ObjectiveFunction.Length, solverOptions.VariableLowerBound.Length, solverOptions.VariableUpperBound.Length) with - | _ , lb, ub when lb <> ub -> - failwithf "Variable vector dimensions should be equal.\nLower Bound Length: %i\nUpper Bound Length: %i" lb ub - | obj, _ , ub when obj <> ub -> - failwithf "Variable vector dimensions should be equal.\nUpper Bound Length: %i\nObjective Function Length: %i" ub obj - | obj, lb, _ when obj <> lb -> - failwithf "Variable vector dimensions should be equal.\nLower Bound Length: %i\nObjective Function Length: %i" lb obj - | _ -> () - - // Variables - let vars = - match solverOptions.SolverAlgorithm with - | LP lp -> - [ for i in 0 .. (solverOptions.VariableLowerBound.Length-1) -> solver.MakeNumVar(solverOptions.VariableLowerBound.[i], solverOptions.VariableUpperBound.[i], (sprintf "var[%i]" i ) ) ] - | IP ip -> - [ for i in 0 .. (solverOptions.VariableLowerBound.Length-1) -> solver.MakeIntVar(solverOptions.VariableLowerBound.[i], solverOptions.VariableUpperBound.[i], (sprintf "var[%i]" i ) ) ] - - // Constraints - let cols = [ for i in 0 .. (solverOptions.VariableLowerBound.Length-1) -> i ] // generate column index selectors - - // Inequality Constraints - match (solverOptions.ConstraintMatrix, solverOptions.ConstraintVectorLowerBound, solverOptions.ConstraintVectorUpperBound) with - | (None, Some lb, Some ub) -> - failwithf "Matrix for Equality Constraints undefined." - | (Some mat, None, Some ub) -> - for row = 0 to (ub.Length-1) do - // generate constraint operands based on indices - let constraintOperands = List.map (fun c -> vars.[c] * mat.[c].[row]) cols - let linearExp = List.reduce (+) constraintOperands - - // create the constraint - let rangeConstraint = RangeConstraint(linearExp, Double.NegativeInfinity, ub.[row]) - solver.Add(rangeConstraint) |> ignore - | (Some mat, Some lb, None) -> - for row = 0 to (lb.Length-1) do - // generate constraint operands based on indices - let constraintOperands = List.map (fun c -> vars.[c] * mat.[c].[row]) cols - let linearExp = List.reduce (+) constraintOperands - - // create the constraint - let rangeConstraint = RangeConstraint(linearExp, lb.[row], Double.PositiveInfinity) - solver.Add(rangeConstraint) |> ignore - | (Some mat, Some lb, Some ub) -> - for row = 0 to (ub.Length-1) do - // generate constraint operands based on indices - let constraintOperands = List.map (fun c -> vars.[c] * mat.[c].[row]) cols - let linearExp = List.reduce (+) constraintOperands - - // create the constraint - let rangeConstraint = RangeConstraint(linearExp, lb.[row], ub.[row]) - solver.Add(rangeConstraint) |> ignore - | _ -> () - - - // Equality Constraints - match (solverOptions.ConstraintMatrixEq, solverOptions.ConstraintVectorEq) with - | (None, Some b) -> - failwithf "Matrix for Equality Constraints undefined." - | (Some mat, Some vec) -> - for row = 0 to (vec.Length-1) do - // generate constraint operands based on indices - let constraintOperands = List.map (fun c -> vars.[c] * mat.[c].[row]) cols - let linearExp = List.reduce (+) constraintOperands - - // create the constraint - let equalityConstraint = RangeConstraint(linearExp, vec.[row], vec.[row]) - solver.Add(equalityConstraint) |> ignore - | _ -> () - - // Objective - let objectiveOperands = List.map (fun c -> solverOptions.ObjectiveFunction.[c] * vars.[c]) cols - let objectiveExp = List.reduce (+) objectiveOperands - - match solverOptions.SolverGoal with - | Minimize -> - solver.Minimize(objectiveExp) - | Maximize -> - solver.Maximize(objectiveExp) - - solver - - /// Solves the optimization problem and prints the results to console - let SolverSummary (solver:Solver) = - let resultStatus = solver.Solve(); - - match resultStatus with - | status when status <> Solver.OPTIMAL -> - printfn "The problem does not have an optimal solution!" - exit 0 - | _ -> - printfn "\nProblem solved in %d milliseconds" (solver.WallTime()) - printfn "Iterations: %i\n" (solver.Iterations()) - - printfn "Objective: %f" (solver.Objective().Value()) - for i in 0 .. (solver.NumVariables()-1) do - printfn "%-10s: %f " (sprintf "var[%i]" i) ((solver.LookupVariableOrNull(sprintf "var[%i]" i)).SolutionValue()) - - solver - diff --git a/ortools/fsharp/README.md b/ortools/fsharp/README.md deleted file mode 100644 index 83b1c4f283..0000000000 --- a/ortools/fsharp/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Google OrTools - F# - -## Pre-requisites -- dotnet core 2.0 -- Mono framework 5.4+ - -## Compiling a standalone binary - -Use the makefile found in the root folder. -```shell -make fsharp -``` -To see the targets type `make help_fsharp`. Note that a keyfile must exist in the `bin` folder as it will be used to sign the assembly. - -## Building Nuget package -Ensure nuget executable is installed and then from root folder run the following: -```shell -make nuget-pkg_fsharp -``` -The output package will include the FSharp binary and examples. It contains binaries for `netstandard2.0` metaframework and `net462`. If using the NETstandard binary you'll need to include a reference in the example to that library on your local system. diff --git a/ortools/fsharp/netfx.props b/ortools/fsharp/netfx.props deleted file mode 100644 index 7a0f31765a..0000000000 --- a/ortools/fsharp/netfx.props +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - true - - - /Library/Frameworks/Mono.framework/Versions/Current/lib/mono - /usr/lib/mono - /usr/local/lib/mono - - - $(BaseFrameworkPathOverrideForMono)/4.5-api - $(BaseFrameworkPathOverrideForMono)/4.5.1-api - $(BaseFrameworkPathOverrideForMono)/4.5.2-api - $(BaseFrameworkPathOverrideForMono)/4.6-api - $(BaseFrameworkPathOverrideForMono)/4.6.1-api - $(BaseFrameworkPathOverrideForMono)/4.6.2-api - $(BaseFrameworkPathOverrideForMono)/4.7-api - $(BaseFrameworkPathOverrideForMono)/4.7.1-api - true - - - $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths) - - \ No newline at end of file