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.*
/* Type for x and explode: Float64 */
foreign func c_pie_ex(x: CPointer<Unit>, explode: CPointer<Unit>, len: Int64): Unit
foreign func c_pie_ex_label(x: CPointer<Unit>, explode: CPointer<Unit>, labels: CPointer<CString>,
len: Int64): Unit
public func pie(x: Vector<Float64>, explode: Vector<Float64>, labels: Array<String>) {
let size = x.size()
if (size != labels.size) {
throw IllegalArgumentException("pie: size of data and labels does not match")
}
var a = unsafe { malloc(UIntNative(8 * size)) }
var labels_ptr = CPointer<CString>(a)
for (i in 0..size) {
var cstr_label = unsafe { LibC.mallocCString(labels[i]) }
unsafe { labels_ptr.write(i, cstr_label) }
unsafe { LibC.free(cstr_label) }
}
unsafe{ c_pie_ex_label(x.ptr, explode.ptr, labels_ptr, size) }
}
public func pie(x: Vector<Float64>) {
let size = x.size()
let ex = zeros<Float64>(size)
unsafe{ c_pie_ex(x.ptr, ex.ptr, size) }
}
public func pie(x: Vector<Float64>, explode: Vector<Float64>) {
let size = x.size()
unsafe{ c_pie_ex(x.ptr, explode.ptr, size) }
}
public func pie(x: Vector<Float64>, labels: Array<String>) {
let size = x.size()
let ex = zeros<Float64>(size)
pie(x, ex, labels)
}
public func testPie1() {
let array_x = [1.0, 3.0, 0.5, 2.5, 2.0]
let x = vector<Float64>(array_x)
pie(x)
save("./tests/imgs/pie/pie_1.svg", "svg")
clear()
}
public func testPie2() {
let array_x = [1.0, 3.0, 0.5, 2.5, 2.0]
let x = vector<Float64>(array_x)
let array_ex = [0.0, 1.0, 0.0, 1.0, 0.0]
let ex = vector<Float64>(array_ex)
pie(x, ex)
save("./tests/imgs/pie/pie_2.svg", "svg")
clear()
}
public func testPie3() {
let array_x = [1.0, 2.0, 3.0]
let x = vector<Float64>(array_x)
let labels = ["Taxes", "Expenses", "Profit"]
pie(x, labels)
save("./tests/imgs/pie/pie_3.svg", "svg")
clear()
}
public func testPie4() {
let array_x = [0.19, 0.22, 0.41]
let x = vector<Float64>(array_x)
pie(x)
save("./tests/imgs/pie/pie_4.svg", "svg")
clear()
}
public func testPie5() {
let array_2010 = [50.0, 0.0, 100.0, 95.0]
let array_2011 = [65.0, 22.0, 97.0, 120.0]
let y2010 = vector<Float64>(array_2010)
let y2011 = vector<Float64>(array_2011)
tiledlayout(2,1)
let ax1 = nexttile()
pie(y2010)
title("2010")
let ax2 = nexttile()
pie(y2011)
title("2011")
save("./tests/imgs/pie/pie_5.svg", "svg")
clear()
}
public func testPie6() {
let array_x = [17.0, 33.0, 33.0, 17.0]
let array_ex = [0.0, 1.0, 1.0, 0.0]
let x = vector<Float64>(array_x)
let ex = vector<Float64>(array_ex)
let labels = ["East(17%)", "North(33%)", "South(33%)", "West(17%)"]
pie(x, ex, labels)
save("./tests/imgs/pie/pie_6.svg", "svg")
clear()
}
public func testPie() {
print(" + testPie\n")
testPie1()
testPie2()
testPie3()
testPie4()
testPie5()
testPie6()
}