ankane / or-tools-ruby

Operations research tools for Ruby
Apache License 2.0
171 stars 20 forks source link

Installation/use on Apple M1 #25

Closed tdegrunt closed 2 years ago

tdegrunt commented 2 years ago

Perhaps this is the wrong place but I can't get or-tools the run on new hardware.

I've installed or-tools using homebrew: brew install or-tools

Then in a test folder, I've done:

bundle init
bundle add or-tools
bundle

This all runs fine, but when I try and run a test ruby file:

require 'or-tools'

locations = [
  {name: "Tokyo", latitude: 35.6762, longitude: 139.6503},
  {name: "Delhi", latitude: 28.7041, longitude: 77.1025}
]

tsp = ORTools::TSP.new(locations)
tsp.route

bundle exec ruby test.rb Traceback (most recent call last): 3: from test.rb:1:in <main>' 2: from test.rb:1:inrequire' 1: from /Users/tdegrunt/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/or-tools-0.5.4/lib/or-tools.rb:2:in <top (required)>' /Users/tdegrunt/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/or-tools-0.5.4/lib/or-tools.rb:2:inrequire': dlopen(/Users/tdegrunt/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/or-tools-0.5.4/lib/or_tools/ext.bundle, 0x0009): symbol not found in flat namespace '__ZN19operations_research10LinearExprC1EPKNS_10MPVariableE' - /Users/tdegrunt/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/or-tools-0.5.4/lib/or_tools/ext.bundle (LoadError)

Any thoughts or pointers?

My arch:

arch arm64

My ruby version: ❯ ruby -v ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [arm64-darwin21]

My /opt/homebrew/opt/or-tools:

❯ find .
.
./LICENSE-2.0.txt
./INSTALL_RECEIPT.json
./bin
./bin/fz
./.brew
./.brew/or-tools.rb
./include
./include/ortools_export.h
./include/ortools
./include/ortools/init
./include/ortools/init/init.h
./include/ortools/bop
./include/ortools/bop/bop_parameters.pb.h
./include/ortools/bop/bop_util.h
./include/ortools/bop/integral_solver.h
./include/ortools/bop/bop_base.h
./include/ortools/bop/bop_lns.h
./include/ortools/bop/bop_solution.h
./include/ortools/bop/bop_types.h
./include/ortools/bop/bop_fs.h
./include/ortools/bop/complete_optimizer.h
./include/ortools/bop/bop_portfolio.h
./include/ortools/bop/bop_solver.h
./include/ortools/bop/bop_ls.h
./include/ortools/util
./include/ortools/util/running_stat.h
./include/ortools/util/bitset.h
./include/ortools/util/integer_pq.h
./include/ortools/util/vector_or_function.h
./include/ortools/util/fp_utils.h
./include/ortools/util/rational_approximation.h
./include/ortools/util/tuple_set.h
./include/ortools/util/sigint.h
./include/ortools/util/time_limit.h
./include/ortools/util/permutation.h
./include/ortools/util/file_util.h
./include/ortools/util/monoid_operation_tree.h
./include/ortools/util/logging.h
./include/ortools/util/optional_boolean.pb.h
./include/ortools/util/range_query_function.h
./include/ortools/util/rev.h
./include/ortools/util/sorted_interval_list.h
./include/ortools/util/proto_tools.h
./include/ortools/util/functions_swig_helpers.h
./include/ortools/util/string_array.h
./include/ortools/util/cached_log.h
./include/ortools/util/affine_relation.h
./include/ortools/util/random_engine.h
./include/ortools/util/vector_map.h
./include/ortools/util/zvector.h
./include/ortools/util/sort.h
./include/ortools/util/saturated_arithmetic.h
./include/ortools/util/testing_utils.h
./include/ortools/util/lazy_mutable_copy.h
./include/ortools/util/functions_swig_test_helpers.h
./include/ortools/util/graph_export.h
./include/ortools/util/range_minimum_query.h
./include/ortools/util/return_macros.h
./include/ortools/util/stats.h
./include/ortools/util/piecewise_linear_function.h
./include/ortools/util/adaptative_parameter_value.h
./include/ortools/scheduling
./include/ortools/scheduling/jobshop_scheduling_parser.h
./include/ortools/scheduling/rcpsp.pb.h
./include/ortools/scheduling/rcpsp_parser.h
./include/ortools/scheduling/jobshop_scheduling.pb.h
./include/ortools/graph
./include/ortools/graph/assignment.h
./include/ortools/graph/graphs.h
./include/ortools/graph/max_flow.h
./include/ortools/graph/minimum_spanning_tree.h
./include/ortools/graph/eulerian_path.h
./include/ortools/graph/cliques.h
./include/ortools/graph/strongly_connected_components.h
./include/ortools/graph/graph.h
./include/ortools/graph/topologicalsorter.h
./include/ortools/graph/connected_components.h
./include/ortools/graph/io.h
./include/ortools/graph/perfect_matching.h
./include/ortools/graph/flow_problem.pb.h
./include/ortools/graph/ebert_graph.h
./include/ortools/graph/util.h
./include/ortools/graph/hamiltonian_path.h
./include/ortools/graph/iterators.h
./include/ortools/graph/linear_assignment.h
./include/ortools/graph/min_cost_flow.h
./include/ortools/graph/christofides.h
./include/ortools/graph/shortestpaths.h
./include/ortools/graph/one_tree_lower_bound.h
./include/ortools/algorithms
./include/ortools/algorithms/knapsack_solver_for_cuts.h
./include/ortools/algorithms/dense_doubly_linked_list.h
./include/ortools/algorithms/sparse_permutation.h
./include/ortools/algorithms/dynamic_partition.h
./include/ortools/algorithms/find_graph_symmetries.h
./include/ortools/algorithms/hungarian.h
./include/ortools/algorithms/knapsack_solver.h
./include/ortools/algorithms/dynamic_permutation.h
./include/ortools/flatzinc
./include/ortools/flatzinc/parser.h
./include/ortools/flatzinc/checker.h
./include/ortools/flatzinc/parser_util.h
./include/ortools/flatzinc/cp_model_fz_solver.h
./include/ortools/flatzinc/model.h
./include/ortools/flatzinc/presolve.h
./include/ortools/sat
./include/ortools/sat/timetable_edgefinding.h
./include/ortools/sat/diffn.h
./include/ortools/sat/swig_helper.h
./include/ortools/sat/parameters_validation.h
./include/ortools/sat/linear_constraint_manager.h
./include/ortools/sat/cuts.h
./include/ortools/sat/symmetry_util.h
./include/ortools/sat/linear_relaxation.h
./include/ortools/sat/cp_model_objective.h
./include/ortools/sat/cp_model_loader.h
./include/ortools/sat/circuit.h
./include/ortools/sat/theta_tree.h
./include/ortools/sat/lp_utils.h
./include/ortools/sat/cp_model.h
./include/ortools/sat/drat_proof_handler.h
./include/ortools/sat/cp_constraints.h
./include/ortools/sat/sat_base.h
./include/ortools/sat/scheduling_constraints.h
./include/ortools/sat/presolve_util.h
./include/ortools/sat/cp_model_postsolve.h
./include/ortools/sat/cp_model_search.h
./include/ortools/sat/cp_model_mapping.h
./include/ortools/sat/synchronization.h
./include/ortools/sat/sat_inprocessing.h
./include/ortools/sat/encoding.h
./include/ortools/sat/cp_model_utils.h
./include/ortools/sat/cp_model_service.pb.h
./include/ortools/sat/cumulative_energy.h
./include/ortools/sat/integer_search.h
./include/ortools/sat/sat_parameters.pb.h
./include/ortools/sat/presolve_context.h
./include/ortools/sat/simplification.h
./include/ortools/sat/linear_constraint.h
./include/ortools/sat/intervals.h
./include/ortools/sat/rins.h
./include/ortools/sat/cp_model_checker.h
./include/ortools/sat/drat_writer.h
./include/ortools/sat/pb_constraint.h
./include/ortools/sat/drat_checker.h
./include/ortools/sat/restart.h
./include/ortools/sat/scheduling_cuts.h
./include/ortools/sat/pseudo_costs.h
./include/ortools/sat/cp_model_presolve.h
./include/ortools/sat/linear_programming_constraint.h
./include/ortools/sat/cp_model_symmetries.h
./include/ortools/sat/sat_solver.h
./include/ortools/sat/util.h
./include/ortools/sat/precedences.h
./include/ortools/sat/cp_model_lns.h
./include/ortools/sat/model.h
./include/ortools/sat/cumulative.h
./include/ortools/sat/implied_bounds.h
./include/ortools/sat/optimization.h
./include/ortools/sat/table.h
./include/ortools/sat/disjunctive.h
./include/ortools/sat/subsolver.h
./include/ortools/sat/cp_model_expand.h
./include/ortools/sat/timetable.h
./include/ortools/sat/var_domination.h
./include/ortools/sat/diffn_util.h
./include/ortools/sat/all_different.h
./include/ortools/sat/integer.h
./include/ortools/sat/probing.h
./include/ortools/sat/boolean_problem.h
./include/ortools/sat/sat_decision.h
./include/ortools/sat/lb_tree_search.h
./include/ortools/sat/zero_half_cuts.h
./include/ortools/sat/integer_expr.h
./include/ortools/sat/boolean_problem.pb.h
./include/ortools/sat/clause.h
./include/ortools/sat/cp_model_solver.h
./include/ortools/sat/feasibility_pump.h
./include/ortools/sat/cp_model.pb.h
./include/ortools/sat/symmetry.h
./include/ortools/gscip
./include/ortools/gscip/gscip_message_handler.h
./include/ortools/gscip/gscip_event_handler.h
./include/ortools/gscip/legacy_scip_params.h
./include/ortools/gscip/gscip.h
./include/ortools/gscip/gscip_parameters.h
./include/ortools/gscip/gscip_ext.h
./include/ortools/math_opt
./include/ortools/math_opt/core
./include/ortools/math_opt/core/sparse_vector_view.h
./include/ortools/math_opt/core/model_update_merge.h
./include/ortools/math_opt/core/solver_interface.h
./include/ortools/math_opt/core/solver.h
./include/ortools/math_opt/core/sparse_collection_matchers.h
./include/ortools/math_opt/core/indexed_model.h
./include/ortools/math_opt/core/math_opt_proto_utils.h
./include/ortools/math_opt/core/model_summary.h
./include/ortools/math_opt/io
./include/ortools/math_opt/io/proto_converter.h
./include/ortools/math_opt/solvers
./include/ortools/math_opt/solvers/glop_solver.h
./include/ortools/math_opt/solvers/cp_sat_solver.h
./include/ortools/math_opt/solvers/message_callback_data.h
./include/ortools/math_opt/solvers/gscip_solver.h
./include/ortools/math_opt/solvers/gscip_solver_callback.h
./include/ortools/math_opt/solvers/gurobi_callback.h
./include/ortools/math_opt/solvers/gurobi_solver.h
./include/ortools/math_opt/cpp
./include/ortools/math_opt/cpp/id_map.h
./include/ortools/math_opt/cpp/arrow_operator_proxy.h
./include/ortools/math_opt/cpp/key_types.h
./include/ortools/math_opt/cpp/result.h
./include/ortools/math_opt/cpp/objective.h
./include/ortools/math_opt/cpp/linear_constraint.h
./include/ortools/math_opt/cpp/model_solve_parameters.h
./include/ortools/math_opt/cpp/math_opt.h
./include/ortools/math_opt/cpp/variable_and_expressions.h
./include/ortools/math_opt/cpp/map_filter.h
./include/ortools/math_opt/cpp/callback.h
./include/ortools/math_opt/cpp/id_set.h
./include/ortools/math_opt/validators
./include/ortools/math_opt/validators/name_validator.h
./include/ortools/math_opt/validators/solver_parameters_validator.h
./include/ortools/math_opt/validators/solution_validator.h
./include/ortools/math_opt/validators/scalar_validator.h
./include/ortools/math_opt/validators/ids_validator.h
./include/ortools/math_opt/validators/sparse_vector_validator.h
./include/ortools/math_opt/validators/callback_validator.h
./include/ortools/math_opt/validators/model_validator.h
./include/ortools/math_opt/validators/model_parameters_validator.h
./include/ortools/lp_data
./include/ortools/lp_data/lp_types.h
./include/ortools/lp_data/sparse_column.h
./include/ortools/lp_data/lp_data_utils.h
./include/ortools/lp_data/mps_reader.h
./include/ortools/lp_data/lp_utils.h
./include/ortools/lp_data/scattered_vector.h
./include/ortools/lp_data/matrix_utils.h
./include/ortools/lp_data/permutation.h
./include/ortools/lp_data/sparse_vector.h
./include/ortools/lp_data/lp_data.h
./include/ortools/lp_data/lp_print_utils.h
./include/ortools/lp_data/model_reader.h
./include/ortools/lp_data/lp_decomposer.h
./include/ortools/lp_data/matrix_scaler.h
./include/ortools/lp_data/sparse_row.h
./include/ortools/lp_data/sparse.h
./include/ortools/lp_data/proto_utils.h
./include/ortools/glop
./include/ortools/glop/dual_edge_norms.h
./include/ortools/glop/markowitz.h
./include/ortools/glop/rank_one_update.h
./include/ortools/glop/status.h
./include/ortools/glop/revised_simplex.h
./include/ortools/glop/primal_edge_norms.h
./include/ortools/glop/parameters.pb.h
./include/ortools/glop/entering_variable.h
./include/ortools/glop/initial_basis.h
./include/ortools/glop/update_row.h
./include/ortools/glop/lu_factorization.h
./include/ortools/glop/basis_representation.h
./include/ortools/glop/reduced_costs.h
./include/ortools/glop/lp_solver.h
./include/ortools/glop/variables_info.h
./include/ortools/glop/preprocessor.h
./include/ortools/glop/pricing.h
./include/ortools/glop/variable_values.h
./include/ortools/port
./include/ortools/port/sysinfo.h
./include/ortools/port/file.h
./include/ortools/port/proto_utils.h
./include/ortools/port/utf8.h
./include/ortools/constraint_solver
./include/ortools/constraint_solver/routing_types.h
./include/ortools/constraint_solver/demon_profiler.pb.h
./include/ortools/constraint_solver/assignment.pb.h
./include/ortools/constraint_solver/solver_parameters.pb.h
./include/ortools/constraint_solver/routing_filters.h
./include/ortools/constraint_solver/search_stats.pb.h
./include/ortools/constraint_solver/python
./include/ortools/constraint_solver/python/pywrapcp_util.h
./include/ortools/constraint_solver/routing_search.h
./include/ortools/constraint_solver/routing_lp_scheduling.h
./include/ortools/constraint_solver/routing_neighborhoods.h
./include/ortools/constraint_solver/java
./include/ortools/constraint_solver/java/javawrapcp_util.h
./include/ortools/constraint_solver/routing_flags.h
./include/ortools/constraint_solver/search_limit.pb.h
./include/ortools/constraint_solver/routing_index_manager.h
./include/ortools/constraint_solver/constraint_solveri.h
./include/ortools/constraint_solver/routing_parameters.h
./include/ortools/constraint_solver/routing_enums.pb.h
./include/ortools/constraint_solver/routing.h
./include/ortools/constraint_solver/routing_parameters.pb.h
./include/ortools/constraint_solver/constraint_solver.h
./include/ortools/base
./include/ortools/base/cleanup.h
./include/ortools/base/stl_logging.h
./include/ortools/base/stl_util.h
./include/ortools/base/strong_vector.h
./include/ortools/base/typeid.h
./include/ortools/base/version.h
./include/ortools/base/small_ordered_set.h
./include/ortools/base/iterator_adaptors.h
./include/ortools/base/threadpool.h
./include/ortools/base/thorough_hash.h
./include/ortools/base/logging_utilities.h
./include/ortools/base/jniutil.h
./include/ortools/base/protoutil.h
./include/ortools/base/logging_export.h
./include/ortools/base/sysinfo.h
./include/ortools/base/file.h
./include/ortools/base/murmur.h
./include/ortools/base/map_util.h
./include/ortools/base/adjustable_priority_queue.h
./include/ortools/base/gzipstring.h
./include/ortools/base/commandlineflags.h
./include/ortools/base/linked_hash_map.h
./include/ortools/base/logging.h
./include/ortools/base/container_logging.h
./include/ortools/base/protobuf_util.h
./include/ortools/base/status_macros.h
./include/ortools/base/timer.h
./include/ortools/base/python-swig.h
./include/ortools/base/small_map.h
./include/ortools/base/macros.h
./include/ortools/base/dynamic_library.h
./include/ortools/base/raw_logging.h
./include/ortools/base/vlog_is_on.h
./include/ortools/base/basictypes.h
./include/ortools/base/status_builder.h
./include/ortools/base/integral_types.h
./include/ortools/base/log_severity.h
./include/ortools/base/mathutil.h
./include/ortools/base/filelineiter.h
./include/ortools/base/base_export.h
./include/ortools/base/bitmap.h
./include/ortools/base/int_type.h
./include/ortools/base/encodingutils.h
./include/ortools/base/hash.h
./include/ortools/base/ptr_util.h
./include/ortools/base/random.h
./include/ortools/base/recordio.h
./include/ortools/base/accurate_sum.h
./include/ortools/base/adjustable_priority_queue-inl.h
./include/ortools/linear_solver
./include/ortools/linear_solver/model_exporter_swig_helper.h
./include/ortools/linear_solver/model_exporter.h
./include/ortools/linear_solver/scip_helper_macros.h
./include/ortools/linear_solver/sat_solver_utils.h
./include/ortools/linear_solver/scip_callback.h
./include/ortools/linear_solver/linear_solver.pb.h
./include/ortools/linear_solver/sat_proto_solver.h
./include/ortools/linear_solver/gurobi_proto_solver.h
./include/ortools/linear_solver/linear_solver.h
./include/ortools/linear_solver/scip_proto_solver.h
./include/ortools/linear_solver/linear_solver_callback.h
./include/ortools/linear_solver/glop_utils.h
./include/ortools/linear_solver/model_validator.h
./include/ortools/linear_solver/linear_expr.h
./include/ortools/gurobi
./include/ortools/gurobi/environment.h
./include/ortools/packing
./include/ortools/packing/arc_flow_builder.h
./include/ortools/packing/vector_bin_packing.pb.h
./include/ortools/packing/arc_flow_solver.h
./include/ortools/packing/vector_bin_packing_parser.h
./README.md
./lib
./lib/cmake
./lib/cmake/ortools
./lib/cmake/ortools/ortoolsConfigVersion.cmake
./lib/cmake/ortools/ortoolsTargets.cmake
./lib/cmake/ortools/ortoolsTargets-release.cmake
./lib/cmake/ortools/ortoolsConfig.cmake
./lib/libflatzinc.9.1.dylib
./lib/libortools.dylib
./lib/libortools.9.dylib
./lib/libortools.9.1.dylib
./lib/libflatzinc.dylib
./lib/libflatzinc.9.dylib
./share
./share/minizinc
./share/minizinc/solvers
./share/minizinc/solvers/ortools.msc
./share/minizinc/ortools
./share/minizinc/ortools/fzn_regular.mzn
./share/minizinc/ortools/fzn_all_different_int.mzn
./share/minizinc/ortools/fzn_cumulative.mzn
./share/minizinc/ortools/nostrings.mzn
./share/minizinc/ortools/redefinitions-2.0.mzn
./share/minizinc/ortools/fzn_circuit.mzn
./share/minizinc/ortools/fzn_inverse.mzn
./share/minizinc/ortools/fzn_network_flow_cost.mzn
./share/minizinc/ortools/fzn_network_flow.mzn
./share/minizinc/ortools/fzn_table_int.mzn
./share/minizinc/ortools/fzn_diffn_nonstrict.mzn
./share/minizinc/ortools/fzn_table_bool.mzn
./share/minizinc/ortools/fzn_subcircuit.mzn
./share/minizinc/ortools/fzn_diffn.mzn
./share/or-tools
./share/or-tools/simple_routing_program.cc
./share/or-tools/simple_lp_program.cc
./share/or-tools/simple_sat_program.cc

homebrew/opt/or-tools on  stable 
❯ 
tdegrunt commented 2 years ago

As these things usually go, I've found a fix. I'm using home-brew's or-tools as mentioned.

export CPLUS_INCLUDE_PATH="/opt/homebrew/include:$CPLUS_INCLUDE_PATH"
bundle config build.or-tools "--with-or-tools-dir=/opt/homebrew/opt/or-tools"

After this a bundle install --redownload fixed it.

Sidenote: Use a bundle version >= 2.2

ankane commented 2 years ago

Hey @tdegrunt, thanks for sharing! I don't have an ARM Mac to test, but I think it should also be possible to do:

bundle config build.or-tools --with-or-tools-dir=/opt/homebrew

(without CPLUS_INCLUDE_PATH since it should add /opt/homebrew/include).

Once a binary installation is available, I'll add it as well. https://github.com/google/or-tools/issues/2893