eaebec39创建于 2024年10月24日历史提交
package scientific.matplot

import std.math.*
import std.unittest.*
import std.unittest.testmacro.*

import scientific.numbers.*
import scientific.linear.*
import scientific.stats.random.*
import scientific.stats.normal.*

/* Return pointer to pair<matplot::bars*, matplot::line*>.
   Type for y: Float64 */
foreign func c_pareto(
    y: CPointer<Unit>, y_len: Int64, 
    names: CPointer<CString>, names_len: Int64,
    p_threshold: Float64, item_threshold: Int64): Unit
foreign func c_pareto_y(
    y: CPointer<Unit>, y_len: Int64): Unit
foreign func c_pareto_y_name(
    y: CPointer<Unit>, y_len: Int64, 
    names: CPointer<CString>, names_len: Int64): Unit
foreign func c_pareto_y_name_p(
    y: CPointer<Unit>, y_len: Int64, 
    names: CPointer<CString>, names_len: Int64,
    p_threshold: Float64): Unit

func pareto(y: Vector<Float64>) {
    let size = y.size()
    unsafe { c_pareto_y(y.ptr, size) }
}

func pareto(y: Vector<Float64>, names: Array<String>) {
    let y_len = y.size()
    let names_len = names.size
    var a = unsafe { malloc(UIntNative(8 * names_len)) }
    var names_ptr = CPointer<CString>(a)
    for (i in 0..names_len) {
        var cstr_name = unsafe { LibC.mallocCString(names[i]) }
        unsafe { names_ptr.write(i, cstr_name) }
        unsafe { LibC.free(cstr_name) }
    }
    unsafe{ c_pareto_y_name(y.ptr, y_len, names_ptr, names_len) }
}

func pareto(y: Vector<Float64>, names: Array<String>, p_threshold: Float64) {
    let y_len = y.size()
    let names_len = names.size
    var a = unsafe { malloc(UIntNative(8 * names_len)) }
    var names_ptr = CPointer<CString>(a)
    for (i in 0..names_len) {
        var cstr_name = unsafe { LibC.mallocCString(names[i]) }
        unsafe { names_ptr.write(i, cstr_name) }
        unsafe { LibC.free(cstr_name) }
    }
    unsafe{ c_pareto_y_name_p(y.ptr, y_len, names_ptr, names_len, p_threshold) }
}

func pareto(y: Vector<Float64>, names: Array<String>, p_threshold: Float64, item_threshold: Int64) {
    let y_len = y.size()
    let names_len = names.size
    var a = unsafe { malloc(UIntNative(8 * names_len)) }
    var names_ptr = CPointer<CString>(a)
    for (i in 0..names_len) {
        var cstr_name = unsafe { LibC.mallocCString(names[i]) }
        unsafe { names_ptr.write(i, cstr_name) }
        unsafe { LibC.free(cstr_name) }
    }
    unsafe{ c_pareto(y.ptr, y_len, names_ptr, names_len, p_threshold, item_threshold) }
}

public func testPareto1() {
    let y = vector<Float64>([90.0, 75.0, 30.0, 60.0, 5.0, 40.0, 40.0, 5.0])

    pareto(y)
    save("./tests/imgs/pareto/pareto_1.svg", "svg")
    clear()
}

public func testPareto2() {
    let codelines = vector<Float64>([200.0, 120.0, 555.0, 608.0, 1024.0, 101.0, 57.0, 687.0])
    let coders = ["Fred", "Ginger", "Norman", "Max", "Julia", "Wally",
                  "Heidi", "Pat"]

    pareto(codelines, coders)
    title("Lines of Code by Programmer")

    save("./tests/imgs/pareto/pareto_2.svg", "svg")
    clear()
}

public func testPareto3() {
    let votes = vector<Float64>([35.0, 50.0, 30.0, 5.0, 80.0])
    let pies = ["Chocolate", "Apple", "Pecan", "Cherry", "Pumpkin"]

    pareto(votes, pies, 1.0)
    ylabel("Votes")

    save("./tests/imgs/pareto/pareto_3.svg", "svg")
    clear()
}

public func testPareto4() {
    let y = vector<Float64>([10.0, 23.0, 7.0, 16.0, 3.0])

    pareto(y)
    save("./tests/imgs/pareto/pareto_4.svg", "svg")
    clear()
}

public func testPareto(){
    testPareto1()
    testPareto2()
    testPareto3()
    testPareto4()
}