@@ -73,23 +73,6 @@ const _giac_lib_handle = Ref{Ptr{Cvoid}}(C_NULL)
7373const _cxxwrap_lib_handle = Ref {Ptr{Cvoid}} (C_NULL )
7474const _wrapper_lib_handle = Ref {Ptr{Cvoid}} (C_NULL )
7575
76- # Find libgiac given a wrapper path
77- function _find_giac_library (wrapper_path:: String )
78- wrapper_dir = dirname (wrapper_path)
79- for giac_name in [" libgiac.so" , " libgiac.so.0" , " libgiac.so.1" , " libgiac.dylib" ]
80- for parent in [wrapper_dir, dirname (wrapper_dir), dirname (dirname (wrapper_dir))]
81- # Check GIAC 2.0.0 location first, then fallback locations
82- for subdir in [" " , " lib" , " ../giac-2.0.0/src/.libs" , " build_julia" , " ../giac/build_julia" ]
83- test_path = joinpath (parent, subdir, giac_name)
84- if isfile (test_path)
85- return test_path
86- end
87- end
88- end
89- end
90- return " libgiac.so" # Fall back to system search
91- end
92-
9376# CxxWrap module for GIAC bindings
9477# The @wrapmodule macro must be called at compile time, so we need the library
9578# path available then via environment variable.
@@ -332,13 +315,6 @@ function _giac_free_expr(ptr::Ptr{Cvoid})
332315 nothing
333316end
334317
335- function _giac_create_context ():: Ptr{Cvoid}
336- # Always return a stub pointer for now
337- # The real context is managed by CxxWrap's GiacContext type
338- # TODO : integrate properly with CxxWrap context
339- return Ptr {Cvoid} (1 )
340- end
341-
342318function _giac_free_context (ptr:: Ptr{Cvoid} )
343319 if ptr == C_NULL
344320 return
@@ -366,28 +342,6 @@ function _giac_expr_type(ptr::Ptr{Cvoid})::Symbol
366342 end
367343end
368344
369- function _type_code_to_symbol (code:: Cint ):: Symbol
370- if code == 0
371- return :integer
372- elseif code == 1
373- return :float
374- elseif code == 2
375- return :complex
376- elseif code == 3
377- return :rational
378- elseif code == 4
379- return :infinity
380- elseif code == 5
381- return :undefined
382- elseif code == 6
383- return :vector
384- elseif code == 7
385- return :matrix
386- else
387- return :symbolic
388- end
389- end
390-
391345function _giac_to_int64 (ptr:: Ptr{Cvoid} ):: Int64
392346 expr_str = _giac_expr_to_string (ptr)
393347 # Handle GIAC boolean representations
@@ -480,82 +434,6 @@ function _giac_free_matrix(ptr::Ptr{Cvoid})
480434 nothing
481435end
482436
483- # ============================================================================
484- # Calculus operations - use string-based GIAC evaluation
485- # ============================================================================
486-
487- function _giac_diff (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , n:: Int , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
488- expr_str = _giac_expr_to_string (expr_ptr)
489- var_str = _giac_expr_to_string (var_ptr)
490- giac_cmd = n == 1 ? " diff($expr_str , $var_str )" : " diff($expr_str , $var_str , $n )"
491- return _giac_eval_string (giac_cmd, ctx_ptr)
492- end
493-
494- function _giac_integrate (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
495- expr_str = _giac_expr_to_string (expr_ptr)
496- var_str = _giac_expr_to_string (var_ptr)
497- return _giac_eval_string (" integrate($expr_str , $var_str )" , ctx_ptr)
498- end
499-
500- function _giac_integrate_definite (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} ,
501- a_ptr:: Ptr{Cvoid} , b_ptr:: Ptr{Cvoid} ,
502- ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
503- expr_str = _giac_expr_to_string (expr_ptr)
504- var_str = _giac_expr_to_string (var_ptr)
505- a_str = _giac_expr_to_string (a_ptr)
506- b_str = _giac_expr_to_string (b_ptr)
507- return _giac_eval_string (" integrate($expr_str , $var_str , $a_str , $b_str )" , ctx_ptr)
508- end
509-
510- function _giac_limit (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , point_ptr:: Ptr{Cvoid} ,
511- dir:: Int , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
512- expr_str = _giac_expr_to_string (expr_ptr)
513- var_str = _giac_expr_to_string (var_ptr)
514- point_str = _giac_expr_to_string (point_ptr)
515- # dir: -1 = left, 0 = both, 1 = right
516- giac_cmd = if dir == - 1
517- " limit($expr_str , $var_str , $point_str , -1)"
518- elseif dir == 1
519- " limit($expr_str , $var_str , $point_str , 1)"
520- else
521- " limit($expr_str , $var_str , $point_str )"
522- end
523- return _giac_eval_string (giac_cmd, ctx_ptr)
524- end
525-
526- function _giac_series (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , point_ptr:: Ptr{Cvoid} ,
527- order:: Int , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
528- expr_str = _giac_expr_to_string (expr_ptr)
529- var_str = _giac_expr_to_string (var_ptr)
530- point_str = _giac_expr_to_string (point_ptr)
531- return _giac_eval_string (" series($expr_str , $var_str =$point_str , $order )" , ctx_ptr)
532- end
533-
534- # ============================================================================
535- # Algebra operations - use string-based GIAC evaluation
536- # ============================================================================
537-
538- function _giac_factor (expr_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
539- expr_str = _giac_expr_to_string (expr_ptr)
540- return _giac_eval_string (" factor($expr_str )" , ctx_ptr)
541- end
542-
543- function _giac_expand (expr_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
544- expr_str = _giac_expr_to_string (expr_ptr)
545- return _giac_eval_string (" expand($expr_str )" , ctx_ptr)
546- end
547-
548- function _giac_simplify (expr_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
549- expr_str = _giac_expr_to_string (expr_ptr)
550- return _giac_eval_string (" simplify($expr_str )" , ctx_ptr)
551- end
552-
553- function _giac_solve (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
554- expr_str = _giac_expr_to_string (expr_ptr)
555- var_str = _giac_expr_to_string (var_ptr)
556- return _giac_eval_string (" solve($expr_str , $var_str )" , ctx_ptr)
557- end
558-
559437function _giac_gcd (a_ptr:: Ptr{Cvoid} , b_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
560438 a_str = _giac_expr_to_string (a_ptr)
561439 b_str = _giac_expr_to_string (b_ptr)
614492# Matrix operations - use string-based GIAC evaluation
615493# ============================================================================
616494
617- function _giac_det (m_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
618- m_str = _giac_expr_to_string (m_ptr)
619- return _giac_eval_string (" det($m_str )" , ctx_ptr)
620- end
621-
622- function _giac_inv_matrix (m_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
623- m_str = _giac_expr_to_string (m_ptr)
624- return _giac_eval_string (" inv($m_str )" , ctx_ptr)
625- end
626-
627- function _giac_trace (m_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
628- m_str = _giac_expr_to_string (m_ptr)
629- return _giac_eval_string (" trace($m_str )" , ctx_ptr)
630- end
631-
632495function _giac_matrix_mul (a_ptr:: Ptr{Cvoid} , b_ptr:: Ptr{Cvoid} , ctx_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
633496 a_str = _giac_expr_to_string (a_ptr)
634497 b_str = _giac_expr_to_string (b_ptr)
@@ -684,48 +547,6 @@ function _giac_matrix_getindex(ptr::Ptr{Cvoid}, i::Int, j::Int)::Ptr{Cvoid}
684547 return _giac_eval_string (" ($m_str )[$i ][$j ]" , C_NULL )
685548end
686549
687- # ============================================================================
688- # Simplified wrappers that use DEFAULT_CONTEXT
689- # These are convenience functions used by api.jl and operators.jl
690- # ============================================================================
691-
692- function _giac_diff (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , n:: Int ):: Ptr{Cvoid}
693- return _giac_diff (expr_ptr, var_ptr, n, DEFAULT_CONTEXT[]. ptr)
694- end
695-
696- function _giac_integrate (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
697- return _giac_integrate (expr_ptr, var_ptr, DEFAULT_CONTEXT[]. ptr)
698- end
699-
700- function _giac_integrate_definite (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} ,
701- a_ptr:: Ptr{Cvoid} , b_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
702- return _giac_integrate_definite (expr_ptr, var_ptr, a_ptr, b_ptr, DEFAULT_CONTEXT[]. ptr)
703- end
704-
705- function _giac_limit (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , point_ptr:: Ptr{Cvoid} , dir:: Int ):: Ptr{Cvoid}
706- return _giac_limit (expr_ptr, var_ptr, point_ptr, dir, DEFAULT_CONTEXT[]. ptr)
707- end
708-
709- function _giac_series (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} , point_ptr:: Ptr{Cvoid} , order:: Int ):: Ptr{Cvoid}
710- return _giac_series (expr_ptr, var_ptr, point_ptr, order, DEFAULT_CONTEXT[]. ptr)
711- end
712-
713- function _giac_factor (expr_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
714- return _giac_factor (expr_ptr, DEFAULT_CONTEXT[]. ptr)
715- end
716-
717- function _giac_expand (expr_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
718- return _giac_expand (expr_ptr, DEFAULT_CONTEXT[]. ptr)
719- end
720-
721- function _giac_simplify (expr_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
722- return _giac_simplify (expr_ptr, DEFAULT_CONTEXT[]. ptr)
723- end
724-
725- function _giac_solve (expr_ptr:: Ptr{Cvoid} , var_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
726- return _giac_solve (expr_ptr, var_ptr, DEFAULT_CONTEXT[]. ptr)
727- end
728-
729550function _giac_gcd (a_ptr:: Ptr{Cvoid} , b_ptr:: Ptr{Cvoid} ):: Ptr{Cvoid}
730551 return _giac_gcd (a_ptr, b_ptr, DEFAULT_CONTEXT[]. ptr)
731552end
@@ -794,50 +615,6 @@ function _giac_create_matrix(expr::String, rows::Int, cols::Int)::Ptr{Cvoid}
794615 return _giac_create_matrix (expr, rows, cols, DEFAULT_CONTEXT[]. ptr)
795616end
796617
797- # ============================================================================
798- # Generic Dispatch via C++ apply_func (Tier 2)
799- # These use the new C++ apply_func* functions for better performance than
800- # string concatenation and evaluation.
801- # ============================================================================
802-
803- """
804- _apply_func_generic(name::String, args::Vector{String}) -> Ptr{Cvoid}
805-
806- Call a GIAC function by name using the C++ generic dispatch mechanism.
807- Falls back to string evaluation if the Gen-based approach fails.
808- """
809- function _apply_func_generic (name:: String , args:: Vector{String} ):: Ptr{Cvoid}
810- try
811- # Convert string args to Gen objects
812- gen_args = [GiacCxxBindings. giac_eval (arg) for arg in args]
813-
814- # Call appropriate apply_func based on arity
815- result_gen = if length (gen_args) == 0
816- GiacCxxBindings. apply_func0 (name)
817- elseif length (gen_args) == 1
818- GiacCxxBindings. apply_func1 (name, gen_args[1 ])
819- elseif length (gen_args) == 2
820- GiacCxxBindings. apply_func2 (name, gen_args[1 ], gen_args[2 ])
821- elseif length (gen_args) == 3
822- GiacCxxBindings. apply_func3 (name, gen_args[1 ], gen_args[2 ], gen_args[3 ])
823- else
824- # N>3 args: use apply_funcN with StdVector
825- std_vec = GiacCxxBindings. StdVector {GiacCxxBindings.Gen} ()
826- for g in gen_args
827- push! (std_vec, g)
828- end
829- GiacCxxBindings. apply_funcN (name, std_vec)
830- end
831-
832- return _make_gen_ptr (result_gen)
833- catch e
834- # Fall back to string evaluation on error
835- @debug " apply_func failed, falling back to string eval: $e "
836- cmd_string = name * " (" * join (args, " ," ) * " )"
837- return _giac_eval_string (cmd_string, C_NULL )
838- end
839- end
840-
841618# ============================================================================
842619# Tier 1 High-Performance Wrappers
843620# These use the direct C++ Tier 1 functions (no name lookup overhead)
0 commit comments