tweaking ffi bindings, bumping version

This commit is contained in:
Andy Pack 2025-02-17 23:22:35 +00:00
parent 8ff7e0ca3c
commit e74c266a6e
Signed by: sarsoo
GPG Key ID: A55BA3536A5E0ED7
12 changed files with 82 additions and 25 deletions
.gitea/workflows
Cargo.lockCargo.toml
FinLib.NET/FinLib
finlib-cpp/include
finlib-ffi
finlib/src/options/blackscholes

@ -131,7 +131,7 @@ jobs:
- name: Push - name: Push
working-directory: ./FinLib.NET/FinLib working-directory: ./FinLib.NET/FinLib
run: dotnet nuget push --source gitea ./bin/Release/FinLib.NET.0.0.3.nupkg run: dotnet nuget push --source gitea ./bin/Release/FinLib.NET.0.0.4.nupkg
buildWASM: buildWASM:
name: Build WASM name: Build WASM

8
Cargo.lock generated

@ -259,7 +259,7 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]] [[package]]
name = "finlib" name = "finlib"
version = "0.0.3" version = "0.0.4"
dependencies = [ dependencies = [
"getrandom 0.2.15", "getrandom 0.2.15",
"log", "log",
@ -274,7 +274,7 @@ dependencies = [
[[package]] [[package]]
name = "finlib-ffi" name = "finlib-ffi"
version = "0.0.3" version = "0.0.4"
dependencies = [ dependencies = [
"cbindgen", "cbindgen",
"csbindgen", "csbindgen",
@ -283,7 +283,7 @@ dependencies = [
[[package]] [[package]]
name = "finlib-wasm" name = "finlib-wasm"
version = "0.0.3" version = "0.0.4"
dependencies = [ dependencies = [
"console_error_panic_hook", "console_error_panic_hook",
"console_log", "console_log",
@ -606,7 +606,7 @@ dependencies = [
[[package]] [[package]]
name = "pyfinlib" name = "pyfinlib"
version = "0.0.3" version = "0.0.4"
dependencies = [ dependencies = [
"finlib", "finlib",
"log", "log",

@ -14,7 +14,7 @@ default-members = [
] ]
[workspace.package] [workspace.package]
version = "0.0.3" version = "0.0.4"
authors = ["sarsoo <andy@sarsoo.xyz>"] authors = ["sarsoo <andy@sarsoo.xyz>"]
description = "Quant finance functions implemented in Rust" description = "Quant finance functions implemented in Rust"
edition = "2021" edition = "2021"

@ -7,8 +7,5 @@ namespace FinLib.Interest;
public static class Interest public static class Interest
{ {
public static double Compound(double principal, double rate, double time, double n) public static double Compound(double principal, double rate, double time, double n) => NativeMethods.interest_compound(principal, rate, time, n);
{
return NativeMethods.interest_compound(principal, rate, time, n);
}
} }

@ -30,4 +30,6 @@ public static class ValueAtRisk
} }
} }
} }
public static double ScaleValueAtRisk(double initialValue, nint timeCycles) => NativeMethods.scale_value_at_risk(initialValue, timeCycles);
} }

@ -1,17 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<PackageId>FinLib.NET</PackageId>
<Version>0.0.4</Version>
<Authors>sarsoo</Authors>
</PropertyGroup>
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks> <TargetFrameworks>netstandard2.0</TargetFrameworks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<PackageId>FinLib.NET</PackageId>
<Version>0.0.1</Version>
<Authors>sarsoo</Authors>
</PropertyGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug' "> <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<Content Include="..\..\target\debug\libfinlib_ffi.*"> <Content Include="..\..\target\debug\libfinlib_ffi.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>

@ -28,9 +28,48 @@ namespace FinLib
[DllImport(__DllName, EntryPoint = "varcovar_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)] [DllImport(__DllName, EntryPoint = "varcovar_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
internal static extern double* varcovar_value_at_risk(double* arr, nuint len, double confidence); internal static extern double* varcovar_value_at_risk(double* arr, nuint len, double confidence);
[DllImport(__DllName, EntryPoint = "scale_value_at_risk", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
internal static extern double scale_value_at_risk(double initial_value, nint time_cycles);
} }
[StructLayout(LayoutKind.Sequential)]
internal unsafe partial struct Portfolio
{
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe partial struct PortfolioAsset
{
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe partial struct OptionVariables
{
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe partial struct CallOption
{
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe partial struct PutOption
{
}
[StructLayout(LayoutKind.Sequential)]
internal unsafe partial struct OptionGreeks
{
}
internal enum ValueType : byte
{
Absolute,
RateOfChange,
}
} }

@ -23,6 +23,8 @@ const double *historical_value_at_risk(const double *arr, size_t len, double con
double interest_compound(double principal, double rate, double time, double n); double interest_compound(double principal, double rate, double time, double n);
double scale_value_at_risk(double initial_value, ptrdiff_t time_cycles);
const double *varcovar_value_at_risk(const double *arr, size_t len, double confidence); const double *varcovar_value_at_risk(const double *arr, size_t len, double confidence);
} // extern "C" } // extern "C"

@ -19,7 +19,18 @@ fn main() {
csbindgen::Builder::default() csbindgen::Builder::default()
.input_extern_file("src/lib.rs") .input_extern_file("src/lib.rs")
.input_extern_file("../finlib/src/lib.rs") .input_extern_file("../finlib/src/lib.rs")
.input_extern_file("../finlib/src/risk/portfolio.rs")
.input_extern_file("../finlib/src/options/blackscholes/mod.rs")
.csharp_dll_name("libfinlib_ffi") .csharp_dll_name("libfinlib_ffi")
.always_included_types([
"Portfolio",
"ValueType",
"PortfolioAsset",
"OptionVariables",
"CallOption",
"PutOption",
"OptionGreeks",
])
.csharp_namespace("FinLib") .csharp_namespace("FinLib")
.generate_csharp_file("../FinLib.NET/FinLib/NativeMethods.g.cs") .generate_csharp_file("../FinLib.NET/FinLib/NativeMethods.g.cs")
.unwrap(); .unwrap();

@ -144,11 +144,11 @@ bitflags = false
############## Options for How Your Rust library Should Be Parsed ############## ############## Options for How Your Rust library Should Be Parsed ##############
[parse] [parse]
parse_deps = false parse_deps = true
# include = [] include = ["finlib"]
exclude = [] #exclude = []
clean = false clean = false
extra_bindings = [] extra_bindings = ["finlib"]

@ -44,3 +44,9 @@ pub unsafe extern "C" fn varcovar_value_at_risk(arr: *const f64, len: usize, con
Box::into_raw(Box::new(finlib::risk::var::varcovar::value_at_risk_percent(input_array, confidence))) Box::into_raw(Box::new(finlib::risk::var::varcovar::value_at_risk_percent(input_array, confidence)))
} }
#[no_mangle]
pub unsafe extern "C" fn scale_value_at_risk(initial_value: f64, time_cycles: isize) -> f64 {
finlib::risk::var::varcovar::scale_value_at_risk(initial_value, time_cycles)
}

@ -255,11 +255,11 @@ pub fn vega(v: &OptionVariables) -> f64 {
#[cfg_attr(feature = "ffi", repr(C))] #[cfg_attr(feature = "ffi", repr(C))]
#[derive(Debug, Copy, Clone, Default, PartialEq, PartialOrd)] #[derive(Debug, Copy, Clone, Default, PartialEq, PartialOrd)]
pub struct OptionGreeks { pub struct OptionGreeks {
delta: f64, pub delta: f64,
gamma: f64, pub gamma: f64,
vega: f64, pub vega: f64,
theta: f64, pub theta: f64,
rho: f64 pub rho: f64
} }
impl OptionGreeks { impl OptionGreeks {