Mathics 7.0 – ทางเลือกโอเพนซอร์สแทน Mathematica
(github.com/Mathics3)- Mathics Core 7.0.0 ปรับโครงสร้างเอนจินหลักของระบบคำนวณโอเพนซอร์สที่เข้ากันได้กับ Mathematica และวางรากฐานสำหรับ การโหลด built-in function แบบ lazy loading ในอนาคต
- เพิ่ม built-in function ใหม่ เช่น
ComplexExpand,ConjugateTranspose,LeviCivitaTensorและฟังก์ชันที่เกี่ยวข้องกับนิพจน์ พีชคณิตเชิงเส้น และการตรวจ判จำนวนจริง - อุดช่องว่างด้านความเข้ากันได้เดิม เช่น
Range[],DirectedInfinity,Indeterminate, การแสดงข้อผิดพลาดของGraphics, การเปลี่ยนแปลง$CharacterEncoding - การโหลด built-in function เปลี่ยนจากการพึ่งพา implicit import มาเป็นการเรียก
import_and_load_builtins()อย่างชัดเจน - รองรับ Python 3.11 และ SymPy 1.12 พร้อมการแก้ไขที่เกี่ยวข้องกับ
Quantity,SparseArray,Derivative,Exit[],BaseForm
ทิศทางของรีลีสและการจัดระเบียบภายใน
- Mathics Core 7.0.0 รวมการปรับโครงสร้างภายในเพื่อรองรับ การโหลด built-in function แบบ lazy loading ในอนาคต
- ปรับ Python code และ style ให้ทันสมัยขึ้น เพิ่ม type annotation และแก้คำสะกดผิดหลายจุด
- อัปเดต dependency ของ SymPy และ Python ให้เป็นเวอร์ชันใหม่ขึ้น
- มีการทำงานเพื่อเพิ่มความเร็วในการโหลดช่วงเริ่มต้นและลดการใช้หน่วยความจำช่วงเริ่มต้นด้วย
Built-in function ใหม่
- built-in function ที่เพิ่มในรีลีสนี้มีดังนี้
$MaxLengthIntStringConversionElementsComplexExpandConjugateTransposeLeviCivitaTensorRealAbs,RealSignRealValuedNumberQ
การปรับปรุงเอกสารและการสร้างชุดทดสอบ
- แก้ ปัญหาการจัดรูปแบบ หลายจุดในเอกสาร PDF
- เพิ่มระยะห่างของเลข section ในสารบัญบทและหัวข้อย่อย
- เพิ่มระยะขอบรอบคำจำกัดความของ built-in function
- แก้คำสะกดผิดทั่วทั้งเอกสาร
- โค้ดสำหรับรัน doctest และสร้างเอกสาร LaTeX ได้รับการปรับปรุงและ refactor
- อนุญาตให้มีการอัปเดต built-in function แบบ incremental
- จัดระเบียบเพื่อลดโค้ดซ้ำ
- ใน “Expression Structure” เพิ่มหัวข้อ Section Head-Related Operations ใหม่
- ชื่อ PDF เปลี่ยนจาก Mathics เป็น Mathics3 และอัปเดตข้อความแนะนำด้วย
- doctest แบบเก่าที่ไม่เปิดเผยและไม่ใช่เพื่อการสอนถูกย้ายไปเป็น pytest
ความเข้ากันได้และการเปลี่ยนแปลงพฤติกรรมที่ผู้ใช้เห็นได้
*Plotไม่แสดงข้อความระหว่างการประเมินผลRange[]รองรับdiที่เป็นค่าลบ- PR ที่เกี่ยวข้อง: #951
- ปรับปรุงการรองรับ
DirectedInfinityและIndeterminate GraphicsและGraphics3Dจะแสดงด้วย พื้นหลังสีชมพู เมื่อมี primitive หรือ directive ที่ไม่ถูกต้อง- ในอินเทอร์เฟซ Mathics-Django จะแสดงข้อความข้อผิดพลาดแบบ tooltip ด้วย
$CharacterEncodingสามารถเปลี่ยนค่าได้ภายใน session
การใช้งานภายในและการเปลี่ยนแปลง API
- แยก
eval_abs,eval_signออกจากAbsและSignแล้วเพิ่มไว้ในmathics.eval.arithmetic - จำนวนหลักสูงสุดของตัวเลขที่อนุญาตในสตริงถูกตั้งไว้ที่ 7000
- ในสภาพแวดล้อมอย่าง pyston ที่ Python ไม่ปรับให้อัตโนมัติ สามารถปรับได้ด้วย environment variable
MATHICS_MAX_STR_DIGITS
- ในสภาพแวดล้อมอย่าง pyston ที่ Python ไม่ปรับให้อัตโนมัติ สามารถปรับได้ด้วย environment variable
- การทำงานของการเปรียบเทียบจำนวนจริงถูกนำเข้าไปไว้ภายใน implementation ของ
RealSign - ใน Python 3.11
$MaxLengthIntStringConversionควบคุมขนาดสูงสุดของการแปลง literal ระหว่างจำนวนเต็มขนาดใหญ่กับสตริง - การโหลด built-in code เปลี่ยนจากแบบ implicit เป็นแบบ สั่งอย่างชัดเจน
- เป็นการเปลี่ยนแปลงเพื่อให้ในอนาคตสามารถทำ lazy loading ของ built-in function หรือ “autoload” แบบ GNU Emacs autoload ได้
- API ใหม่ต้องเรียก
import_and_load_builtins()อย่างชัดเจน- ก่อนหน้านี้ เวลาที่ built-in function ถูกโหลดขึ้นอยู่กับลำดับ import แบบ implicit และไม่แน่นอน
- เพิ่ม LRU cache ให้
mpmath
การแก้บั๊กของ Quantity·SparseArray และอื่น ๆ
Definitionsเข้ากันได้กับ pickle- ปรับปรุงการรองรับนิพจน์
Quantity- รวมถึงการแปลง การจัดรูปแบบ และการคำนวณเชิงเลขคณิต
- ตัวเลือก
BackgroundของGraphicsและGraphics3Dกลับมาทำงานอีกครั้ง - แก้ปัญหาการเปรียบเทียบเชิงตัวเลขสำหรับนิพจน์ที่มี
String- issue ที่เกี่ยวข้อง: #797
- แก้ปัญหา
Switch[]ที่มีInfinity- issue ที่เกี่ยวข้อง: #956
- แก้ปัญหา
Outer[]สำหรับSparseArray- issue ที่เกี่ยวข้อง: #939
ArrayQ[]ตรวจจับSparseArrayได้- PR ที่เกี่ยวข้อง: #947
- จัดการ exception
BoxExpressionError - แก้พฤติกรรมที่
Derivativeประเมินค่าTrue,False,List[] - รวมการแก้ไขแพ็กเกจ
Combinatorica - แก้
Exit[]ที่ไม่ทำงาน BaseFormถูกเพิ่มใน$OutputForms
เวอร์ชันแพ็กเกจที่รองรับ
- รองรับ Python 3.11
- รองรับ SymPy 1.12
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมติดตามโปรเจกต์นี้มาหลายปีแล้ว และมันก็พัฒนาไปได้ดีอย่างต่อเนื่อง หากสนใจ ระบบพีชคณิตคอมพิวเตอร์ แบบโอเพนซอร์ส ก็มีทางเลือกที่สุกงอมกว่านี้อยู่มาก ตั้งแต่ตัวเลือกคลาสสิกอย่าง GNU Octave หรือ Maxima ไปจนถึงตัวเลือกสมัยใหม่อย่าง SAGEmath, Symbolics.jl, sympy
ขอบเขตกว้างตั้งแต่ไลบรารีคำนวณเชิงสัญลักษณ์อย่าง GiNaC ไปจนถึง IDE แบบมีทุกอย่างพร้อมใช้ในตัวอย่าง SAGEmath และชุมชนก็ยังคึกคักด้วย ตัวอย่างเช่น SAGEmath แทบจะเป็นผู้บุกเบิกอินเทอร์เฟซเว็บโน้ตบุ๊ก และผมมองว่ามันนำไปสู่ Jupyter ในรูปแบบต่าง ๆ ทุกวันนี้
โดยส่วนตัวผมชอบสไตล์แบบ Lisp ของ Mathematica (MMA) แต่สิ่งที่ทำให้ MMA ทรงพลังไม่ใช่แค่แกนหลัก แต่คือไลบรารีขนาดมหึมา ในหัวข้อพื้นฐานอย่างการอินทิเกรตเชิงสัญลักษณ์ กราฟิก 2D/3D และวิธีไฟไนต์เอลิเมนต์ก็มีโซลูชันระดับแนวหน้าของวงการ และยังมีสาขาเฉพาะทางมากมายอย่างชีวสารสนเทศด้วย
Mathics ดูเหมือนจะทำซ้ำส่วนแกนหลักได้ดี แต่แน่นอนว่ายังขาดไลบรารีทั้งหมดเหล่านั้น ตรรกะเดียวกันนี้ใช้ได้เมื่อเปรียบเทียบ Matlab กับ “toolkit” หลายตัวกับโคลนของ numpy แต่กระแส Python ตอนนี้ได้นำโค้ดใหม่ ๆ จำนวนมากที่ไม่ได้ทำงานใน Matlab เข้าสู่โลกของ numpy แล้ว
ตอนที่มันออกมาครั้งแรกเมื่อราว 5 ปีก่อน ผมคิดว่า “เอนจินประเมินผลเชิงสัญลักษณ์ทำมาได้ดีจริง ๆ ต่อไปมาดูกันว่าจะเป็นอย่างไร” ต่อไปทุกครั้งที่อยากเริ่มโปรเจกต์ใหม่ ผมคงต้องนึกถึงตัวอย่างการค่อย ๆ ขัดเกลาโปรเจกต์เก่านี้ไว้
พวกมันเป็นสิ่งที่เติมเต็มกัน และมักถูกใช้ร่วมกันด้วย Mathematica กับ Mathics ดูเหมือนจะรองรับทั้งสองพาราไดม์ แต่ก็ไม่ใช่สิ่งเดียวกัน
ดูเหมือนจะอิงจาก sympy: https://www.sympy.org/en/index.html
ถ้าต้องการใช้ส่วนตัวเท่านั้น Wolfram Cloud ใช้ได้ฟรี ไฟล์ดูเหมือนจะถูกลบหลังผ่านไปราว 30 วัน Wolfram Engine ก็เป็นวิธีใช้ฟรีเพื่อใช้ Mathematica จากบรรทัดคำสั่งเหมือนกัน เอาเถอะ ดีกว่าไม่มีอะไร
มีคำแนะนำ Mathics ที่เรียบง่ายกว่านี้อยู่ที่นี่:
https://mathics.org/
ไม่รู้ทำไมรู้สึกว่านี่น่าจะถูกรวมเข้าไปใน SageMath :D
หนึ่งในเหตุผลที่ SageMath เป็นโปรเจกต์ Cython ที่ใหญ่ที่สุด ก็เพราะ Cython ช่วยให้ Sage ใช้ประโยชน์จากไลบรารี C/C++ ที่รวดเร็วได้
ตอนนี้ Mathics ดูเหมือนจะยังไม่ได้ใส่ใจเรื่องประสิทธิภาพอย่างจริงจังนัก เช่น ลองรันไมโครเบนช์มาร์กเล็ก ๆ อย่าง
"AbsoluteTiming[Sum[i, {i, 1, 100000}]]"ใน Mathics หรืออ่านโรดแมปดูก็ได้แน่นอนว่านี่ไม่เป็นไร ภาษาโปรแกรมของ Mathematica มีการประยุกต์ใช้น่าสนใจจำนวนมากที่ประสิทธิภาพไม่ใช่เรื่องสำคัญ เช่น ใช้ค่อย ๆ ไล่ตามการคำนวณเชิงสัญลักษณ์บางอย่างทีละขั้นอย่างระมัดระวังไปพร้อมกับนิพจน์
แต่แรงจูงใจหลักของนักพัฒนา Sage คือคณิตศาสตร์วิจัยระดับแนวหน้า และในบริบทนั้นประสิทธิภาพแทบจะสำคัญมากเสมอ เหตุผลที่ Sage ไม่ได้ใช้แค่ sympy แต่กลับ implement ฟังก์ชันคล้าย ๆ กันเองจำนวนมากก็เพราะประสิทธิภาพ sympy ให้ความสำคัญกับความง่ายในการติดตั้ง จึงอาจค่อนข้างช้า ส่วนใน SageMath ความง่ายในการติดตั้งไม่ใช่ลำดับความสำคัญเลย
พันธกิจของ SageMath คือการเป็นทางเลือกที่ใช้งานได้จริงแทน Mathematica, Matlab, Magma, Maple แต่ไม่ได้หมายความว่าจะต้องเป็นโคลน เช่น ไม่ได้หมายถึงการรันโค้ด Mathematica ได้โดยตรง แต่หมายถึงเป็นทางเลือกที่สามารถรองรับงานวิจัยซึ่งเดิมทีต้องทำด้วยโปรแกรมปิดเหล่านั้น บนซอฟต์แวร์คณิตศาสตร์โอเพนซอร์ส
วิศวกรซอฟต์แวร์ทำทุกอย่างเพื่อจะไม่ต้องจ่าย ค่าซอฟต์แวร์
Mathematica มีให้ใช้ฟรีบน Raspberry Pi[1] และมหาวิทยาลัยส่วนใหญ่ก็มีไลเซนส์แบบครอบคลุมทั้งไซต์อยู่แล้ว ไลเซนส์ “Home & Hobby” ก็ไม่ได้แพงขนาดนั้น โดยแบบสมัครสมาชิกปีละ 195 ดอลลาร์ ไลเซนส์ถาวร 390 ดอลลาร์ และค่าต่ออายุแค่ 175 ดอลลาร์[2]
พูดตรง ๆ ถ้าเป็นคนที่สนใจ tinkering แต่จ่ายราคานั้นไม่ไหว เวอร์ชันแคร็กก็ไม่ได้หายากหรือติดตั้งยากอะไร
โดยส่วนตัวแล้วผมค่อนข้างชอบ Mathematica หรือพูดให้ถูกคือ “Wolfram Language” และก็ยินดีจ่ายค่าไลเซนส์สำหรับงานอดิเรกด้วย ไม่ใช่แค่คิดว่าคุ้มเงิน แต่ยังมองว่าการสนับสนุนซอฟต์แวร์คณิตศาสตร์เป็น “เหตุผลที่ดี” ที่ควรจ่ายเงิน
แถมช่างภาพสมัครเล่นมักจ่ายเงินให้เครื่องมืออย่าง Adobe CC มากกว่าที่โปรแกรมเมอร์จำนวนมากจ่ายให้เครื่องมือทั้งหมดของตัวเองเสียอีก ซึ่งผมไม่เข้าใจว่าทำไม เช่นเดียวกับการยอมจ่ายบริการสมัครสมาชิกหลายอย่างเดือนละ 20~40 ดอลลาร์ขึ้นไป แต่กลับลังเลกับค่าไลเซนส์ 200~400 ดอลลาร์
แต่ในกรณีของผม เวลาที่ใช้กับ Mathematica น่าจะมากกว่าโปรแกรมแทบทุกตัวที่ติดตั้งอยู่ในคอมพิวเตอร์
ถึงอย่างนั้น ซอฟต์แวร์คณิตศาสตร์โอเพนซอร์ส ก็ยังมีที่ทางสำคัญอยู่ดี โดยรวมแล้ว Mathematica ครอบคลุมกว้างมาก แต่ในคณิตศาสตร์ระดับสูงก็ยังมีช่องโหว่ใหญ่ ๆ อยู่
โดยเฉพาะมีเหตุผลสองข้อที่ทำให้ยากจะเชื่อว่าจะตอบโจทย์สาขาคณิตศาสตร์ที่ “เฉพาะทาง” กว่านั้นได้ด้วย ข้อแรก ยิ่งเป็นสาขาที่สูงขึ้นหรือเข้าใจยากขึ้น ผลตอบแทนต่อการลงทุนก็ยิ่งลดลงอย่างรวดเร็ว ข้อสอง Wolfram Language มีฟังก์ชันในตัวมากกว่า 6,000 ตัวอยู่แล้ว ดังนั้นการเพิ่มอีกหลายร้อยตัวเพื่อรองรับสาขาอย่างทฤษฎีกลุ่มอย่างครอบคลุมจึงดูไม่ค่อยสมเหตุสมผล
อาจรองรับผ่านแพ็กเกจได้ก็จริง แต่เพราะไม่ได้รับการรองรับแบบชั้นหนึ่งในเคอร์เนล จึงมีต้นทุนด้านประสิทธิภาพ และผู้ใช้ก็ต้องตั้งใจไปหาใช้เอง ทำให้มีต้นทุนด้านการใช้งานด้วย
ดังนั้นซอฟต์แวร์โอเพนซอร์สอย่าง GAP, M2, PARI/GP จึงมีบทบาทสำคัญในการอุดช่องว่างของ Wolfram Language สำหรับผม ผมบริจาคให้โปรเจกต์ FOSS พอ ๆ กับที่จ่ายค่าไลเซนส์ Mathematica ส่วนโปรเจกต์ที่การสนับสนุนเป็นเงินทำได้ไม่ง่าย ผมก็พยายามใช้เวลาและทักษะไปช่วยปรับปรุง
พูดตรง ๆ ผมไม่ได้สนใจโปรเจกต์ที่พยายามทำซ้ำฟังก์ชันของ Mathematica มากนัก แน่นอนว่าโปรเจกต์เหล่านั้นก็คงจะพัฒนาและดีขึ้นต่อไป และอย่างน้อยก็ช่วยกดดันให้ Wolfram Research ปรับปรุงฟังก์ชันพื้นฐานต่อเนื่อง แต่ถ้าโปรเจกต์เหล่านั้นจะไล่ตาม Mathematica/WL ในปัจจุบันให้ทัน ก็น่าจะต้องใช้เวลา 10~20 ปี
[1]: https://www.wolfram.com/raspberry-pi/
[2]: https://www.wolfram.com/mathematica/pricing/home-hobby/
โน้ตบุ๊กแบบบูรณาการ เอกสารที่แสดงเมื่อเอาเมาส์ชี้ และที่น่าทึ่งคือ namespace ขนาดยักษ์เดียวที่มีฟังก์ชันหลายพันตัว somehow ผสานกันจนให้ประสบการณ์ที่เรียบง่ายและมีประสิทธิภาพแบบที่ผมไม่เคยเจอมาก่อน ทั้งที่ปกติผมก็ไม่ใช่คนชอบ IDE แบบ “หนัก ๆ” ด้วยซ้ำ
สิ่งหนึ่งที่น่าหงุดหงิดใน Mathematica คือฟังก์ชันทั้งหมดถูกยัดไว้ใน namespace เดียวกัน และไม่มีการโอเวอร์โหลดตามตัวเลือกการกำหนดพารามิเตอร์ที่ต่างกัน
ตัวอย่างความซ้ำซ้อนใหญ่ ๆ ที่นึกออกก็คงมีแค่ฟังก์ชัน Plot หลาย ๆ ตัวเท่านั้น