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()
}