Categories
Mathematica

เรียก compiled function จาก compiled function

โดยปกติ Mathematica หรือภาษา Wolfram จะมีปัญหากับการเรียก function ที่สร้างจาก Compile ใน function ที่จะสร้างจาก Compile อีกทีได้ (ส่วนใหญ่เป็นเรื่องที่เกี่ยวกับว่า Funcions ไหนที่มัน compile ได้หรือไม่ได้) แต่ใน version 12 นี้เราสามารถที่จะทำแบบนั้นได้ ถ้า function เหล่านั้นถูก compile ด้วยคำสั่ง FunctionCompile ซึ่งผมมองว่ามันสะดวกอย่างมาก และที่สำคัญเราสามารถที่จะ export สร้างเป็น library ไฟล์ได้ด้วย โดยคำสั่ง FunctionCompileExport สกุลไฟล์ที่สร้างได้ก็ได้แก่

ตัวอย่างการเรียกใช้ compiled function ใน compiled function อีกที ก็สมมุติให้ผมมี function สำหรับทำ bisection เพื่อหาค่าที่ทำให้ function ที่สนใจเป็น 0 หรือใกล้ 0 มากๆ

BisectionMethod = FunctionCompile[
    Function[
        {Typed[f, {"Real64"} -> "Real64"], Typed[lim0, "Real64"], Typed[lim1, "Real64"]},
      Module[{Maxiter = 100, tol = 10.^-8, iter = 0, x0 = lim0, x1 = lim1, mid = 0.0, f0, f1, fmid},
      f0 = f[x0]; 
      f1 = f[x1];
            While[Abs[x1 - x0] >= tol && iter++ < Maxiter,
                mid = (x1 + x0)/2.;
                fmid = f[mid];
                If[Xor[fmid > 0, f0 > 0],
                    x1 = mid; f1 = fmid,
                    x0 = mid; f0 = fmid]];
               mid]]]

โดยfunction ที่ผมจะหา root คือ f(x) = sin(x)+exp(x)

f = FunctionCompile[Function[Typed[arg, "Real64"], Sin[arg] + Exp[arg]]]

จะเห็นได้ว่าทั้ง BisectionMethod และ f ถูกสร้างจาก FunctionCompile แต่ f จะถูกเรียกเข้าไปใช้ใน BisectionMethod อีกที

BisectionMethod[f, -1.0, 1.0]-FindRoot[Sin[x] + Exp[x], {x, -1}][[1, 2]]
(* -5.18667*10^-11 *)
Categories
Mathematica

การแพร่กระจายของโรคไข้เลือดออกในจีน

พอดีว่าต้องทำ slides ไปโชว์ว่างานที่รับอยู่ไปถึงไหนแล้ว มันมีส่วนหนึ่งที่ต้องทำให้เห็นว่าผลที่ได้จากโมเดลการระบาดของไข้เลือดออกในจีนกับข้อมูลจริงนั้นมันใกล้เคียงกัน พอดีผมไปเจองานอยู่งานหนึ่งที่น่าสนใจคือ https://bmcmedicine.biomedcentral.com/articles/10.1186/s12916-015-0336-1

figure5

เขามีplotกราฟที่แสดงให้เห็นว่ามีการรายงานผู้ติดเชื้อไข้เลือดออกครั้งแรกของแต่ล่ะเมืองของจีนในปีใด ซึ่งผมก็ลองเอามาทำเป็น animation ในโปรแกรม Mathematica ดูสำหรับเปรียบเทียบให้เห็นไปเลยกับโมเดลที่ทำ

โดยผมเขียน code ตามนี้ครับ

Categories
Mathematica

เรื่องการเรียกใช้ package ใน package อีกทีของภาษา Wolfram

พอดีกำลังรับงานพัฒนาโมเดลตัวหนึ่งด้วยภาษา Wolfram แล้วเจอปัญหาเรื่องการเรียกใช้ Package ในอีก Package หนึ่ง code ที่เขาส่งมาให้ช่วยดูให้มันมีการเรียกใช้ package ตั้งแต่คำสั่ง BeginPackage เช่น

BeginPackage[ "Package`", {"Package1`", "Package2`"}]
  ...

แต่ปรากฏว่าหลังจากที่ทำการ deploy ไปแล้ว เจอว่ามันมีการคำนวณอะไรบางอย่างผิด ทั้งที่ในตัว unit test ก็ไม่เจอ ผมก็นั่งไล่ดูทีล่ะบรรทัดจนพบว่ามันมีการเขียนทับ functions กัน เพราะชื่อดันเหมือนกัน

ผมก็เลยเปลี่ยนวิธีการเรียก packages ด้วย Needs ไปใช้วิธีเรียกทีล่ะตัวหลังคำสั่ง BeginPackage แทน เช่น

BeginPackage[ "Package`"]
  Needs[ "Package1`"]
  Needs[ "Package2`"]
  ...

ด้วยวิธีนี้ตัว คำสั่งจาก package1 หรือ package2 จะถูกเรียกใช้ได้ภายใน package แต่ด้านนอก package จะเรียกไม่ได้ พูดง่ายๆคือไม่มีผลอะไรกับตัวแปรนอก package

Categories
Uncategorized

เรียกใช้ MathNet ใน Mathematica

ที่ต้องระวังคือถ้า methods ใน C# มีการใช้ตัวแปรเป็น Matrix<> หรือ Vector<> เวลาจะส่งผ่านค่า Matrix หรือ Vector จาก Mathematica เข้าไปซึ่งมันเป็น List จะต้องทำการแปลงเป็น Matrix หรือ Vector โดยอาศัย constructors จากตัว MathNet ก่อน

ตัวอย่างเช่น มี Method Neighbors ที่ต้องการ Matrix<double> ตามนี้

เวลาเรียกจาก Mathematica ก็ทำตามนี้ครับ

สังเกตตัวแปร mat ถูกสร้างขึ้นมาจาก คำสั่งนี้ครับ

NETNew["MathNet.Numerics.LinearAlgebra.Double.DenseMatrix", 10, 10, 
RandomReal[1, 100]]

Categories
Uncategorized

funtions และ options ในภาษา Wolfram

https://mathematica.stackexchange.com/questions/353/functions-with-options อธิบายการใช้งาน Functions และ Options ต่างๆไว้ดีมากครับ

Categories
Mathematica

Indivaria

Indivaria เป็น Mathematica package ที่ผมเขียนในช่วง 2009-2011 ซึ่งเป็นช่วงที่ผมเริ่มทำงานที่ MORU และก็กำลังเรียนป.เอกที่ OU ไปด้วย โดยปัญหาที่สนใจทำช่วงนั้นก็คือการดื้อยาของอาร์ทิมิสนินที่ยังไม่มีใครรู้เรื่องกลไกลของมันเลยว่าเกิดขึ้นได้อย่างไร แบบจำลองที่ทำก็เป็นแบบคร่าวๆที่จะช่วยอธิบายจากข้อมูลที่มี ซึ่งแบบจำลองนั้นก็มีหลากหลาย โดยผมก็ได้เขียนรวบรวมบางส่วนไว้เป็น package ในภาษา C#, R, และ Mathematica ที่เขียนไว้หลายภาษาก็เพราะว่าผมต้องหาวิธีการ fit ข้อมูลกับแบบจำลองที่คิดขึ้นมา แต่สุดท้ายแล้วก็ต้องไปจบที่ Mathematica เป็นหลัก เพราะไม่มีเวลาที่ดูต่อแล้วเพราะต้องรีบเรียนให้จบป.เอกให้ทันกำหนดเวลาที่มี และ Mathematica เองก็ง่ายมากสำหรับในการ run แบบขนานในการ fit ข้อมูล

ผมได้แชร์ code ของ Indivaria สำหรับ Mathematica ไว้ที่

https://github.com/slphyx/Indivaria

โดยผมตั้งใจว่าจะทำมันต่อถ้ามีเวลา โดยจะรวบรวม model ต่างๆที่เกี่ยวข้องมารวบรวมไว้ให้มากที่สุด หวังว่าจะมีคนเอาไปศึกษาต่อ

Categories
Mathematica

ขำๆแก้ง่วง

ls =
  Table[
   img = CurrentImage[];
   HighlightImage[img,
    {Gray, Values@FacialFeatures[ CurrentImage[], "EyePoints"], Blue, 
     FindFaces[img]}]
   , {i, 30}];

Export["facial.gif", ls, AnimationRepetitions -> Infinity]
txt = "ไปไหนกันหมด";
THfontfam = Select[$FontFamilies, StringTake[#, 2] == "TH" &];

ls = Table[
   Text[Style[txt, RandomColor[30], 
     FontFamily -> RandomChoice[THfontfam], FontSize -> 48], 
    RandomReal[1, {2}], Automatic, RandomReal[{-1, 1}, {2}]], {50}];

Export["vru.gif", 
 Table[Graphics[ls[[1 ;; i]], PlotRange -> {{-1, 2}, {-2, 2}}], {i, 1,
    50}], AnimationRepetitions -> Infinity, "DisplayDurations" -> 0.5]
Categories
Mathematica

Metapopulation ของโรคไข้เลือดออก

พอดีว่าได้มีโอกาสไปร่วมทำงานวิจัยเรื่องการวางแผนการจัดการโรคไข้เลือดออกด้วยยุงติดเชื้อ Wolbachia ที่สถาบันข้อมูลขนาดใหญ่ (Big data institute) ที่มหาวิทยาลัยอ๊อกซ์ฟอร์ด โดยทางผมได้เสนอแบบจำลองคณิตศาสตร์ที่มีการใช้ข้อมูลแผนที่ต่างๆ อย่างเช่น การกระจายตัวของประชากร ที่อยู่อาศัยหรือการกระจายตัวของยุง แผนที่ที่คาดว่ายุงสามารถอยู่อาศัยได้ และแผนที่ของการเกิดโรคไข้เลือดออก เพื่อทำนายการกระจายตัวของโรคไข้เลือดออก และการวางแผนการปล่อยยุงที่ติดเชื้อ wolbachia รูปร่างหน้าตาของแบบจำลองคร่าวๆ ที่ให้ดูได้ก็จะประมาณนี้ครับ

ไอเดียก็ประมาณว่าถ้าในบริเวณไหนมียุงติดเชื้อ wolbachia บริเวณนั้น็จะไม่มีไข้เลือดออกเลย การกระจายของยุงและเชื้อไข้เลือดออกก็ขึ้นกับว่าบริเวณนั้นและบริเวณใกล้เคียงมียุง หรือยุงอาศัยได้หรือไม่ มีคนอาศัยอยู่หรือเปล่า จากงานนี้เราจะสามารถวางแผนได้ว่าจะปล่อยยุงติดเชื้อนี้อย่างไร ตรงไหนถึงจะคุ้มค่า ในช่วงระยะเวลาที่จำกัดได้

Categories
Uncategorized

Merry Christmas and a Happy New Year!!

library(rgl)
open3d()
bg3d("black")
t <- seq(0,8*pi, by = 0.01);
x <- c(t*cos(t),t*cos(t+0.5*pi),t*cos(t+pi),t*cos(t+1.5*pi))
y <- c(t*sin(t),t*sin(t+0.5*pi),t*sin(t+pi),t*sin(t+1.5*pi))
z <- -c(t,t,t)
plot3d(x, y, z, col = rainbow(1000),box=FALSE,axes=FALSE,xlab="",ylab="",zlab="")
text3d(1,8, text = "Merry Christmas and", adj = 0.5, color = "green")
text3d(1,4, text = "a Happy New Year!", adj = 0.5, color = "green")
points3d(runif(100,min=-25,max = 25),runif(100,min=-25,max = 25),-runif(100,max = 25),color="white")
Categories
Mathematica

Wolfram animation in Jupyter

หลังๆมานี้ตั้งแต่ Wolfram Engine มันใช้ได้ฟรี ผมก็มักจะแนะนำให้คนโน่นคนนี้ใช้มันอยู่เรื่อยๆ หลายคนที่ก็ชอบ ส่วนอีกหลายคนก็ยังรู้สึกอึดอัดเพราะมันยังไม่ชินหรือไม่ก็เพราะ UI มันไม่มีไม่น่าใช้ ยิ่งแนะนำให้ใช้กับ Jupyter ยิ่งหนักเลยเพราะยังทำ Animation ไม่ได้หรือพวก 3D ทั้งหลายก็หมุนไม่ได้ zoom ก็ไม่ได้ ยิ่งคำสั่งพวก Manipulate ที่ถือได้ว่าเป็นสิ่งหลักที่ถูกใช้ในหลายๆงานก็ใช้ไม่ได้เลย

ส่วนตัวผมก็ยังถือว่ามันไม่ได้แย่ขนาดนั้น เพราะทางWolframเองก็คงเข้าใจว่าถ้าเอาWolfram engine ไปใช้โดยไม่มีUI ที่เหมือน Mathematica notebook คนคงมาใช้งานมันน้อยแน่ๆ เขาเลยเอา WolframPlayer ติดมาด้วยกับ Wolfram engine ซึ่งนั่นหมายความว่าผู้ใช้ก็ต้อง Export สิ่งที่ต้องการอย่าง 3D, Animation อื่น ๆมาอยู่ในรูปแบบ notebook (.nb) หรือ .cdf แล้วเปิดในตัว player แทน

ซึ่งถ้าใช้ตัว Jupyter กับ Wolfram ก็สามารถที่จใช้คำสั่ง RunProcess เรียกตัว Player มาเปิดไฟล์ที่ Exportได้ อย่างเช่น

outfile=FileNameJoin[{Directory[],outputfilename}];

RunProcess[{"C:\Program Files\Wolfram Research\Wolfram Engine\12.0\SystemFiles\FrontEnd\Binaries\Windows-x86-64\WolframPlayer.exe",outfile}]