Google OR-Tools v9.9
a fast and portable software suite for combinatorial optimization
|
(user): Determine whether any of these would bring any benefit:
(user): This is a work in progress. The algo is not fully implemented yet. The initial version is closer to Blossom IV since we update the dual values for all trees at once with the same delta.
(user) although it is already possible, using the GroupForwardArcsByFunctor method, to group all the outgoing (resp. incoming) arcs of a node, the iterator logic could still be improved to allow traversing the outgoing (resp. incoming) arcs in O(out_degree(node)) (resp. O(in_degree(node))) instead of O(degree(node)).
(user) it is possible to implement arc deletion and garbage collection in an efficient (relatively) manner. For the time being we haven't seen an application for this.
(user): handle timeouts, compute row and column statuses.
(user): either implement with SCIP constraint handlers or use a solver independent implementation.
(user): an alternative would be to evaluate: A.V. Goldberg, "The Partial Augment-Relabel Algorithm for the Maximum Flow
Problem.” In Proceedings of Algorithms ESA, LNCS 5193:466-477, Springer 2008.
http://www.springerlink.com/index/5535k2j1mt646338.pdf<p> \anchor _todo000035 : it could be even faster than that when the values are in [0..N) for a
known value N that's significantly lower than the max integer value.
<p> \anchor _todo002191 (user): for now it is mainly presolve, but the idea is to call these
function during the search so they should be as incremental as possible. That
is avoid doing work that is not useful because nothing changed or exploring
parts that were not done during the last round.
<p> \anchor _todo000033 (user): Merge this code with algorithms/knapsack_solver.<p> \anchor _todo000350 (user): Move all existing routing search code here.
<p> \anchor _todo000769 (user): post c++ 14, instead use
std::pair<MPSolver::OptimizationProblemType, const absl::string_view>
once pair gets a constexpr constructor.
<p> \anchor _todo000028 (user): base this code on LinearSumAssignment.<p> \anchor _todo000637 (user): implement pruning procedures on top of the Held-Karp algorithm.<p> \anchor _todo000893 (b/180617976): change this behavior.<p> \anchor _todo000676 (user): See whether the following can bring any improvements on real-life
problems.
R.K. Ahuja, A.V. Goldberg, J.B. Orlin, and R.E. Tarjan, "Finding minimum-cost flows by double scaling," Mathematical Programming, (1992) 53:243-266.
http://www.springerlink.com/index/gu7404218u6kt166.pdf<p> \anchor _todo000929 (user): These tests are incomplete in a few ways; see mip_tests.cc
<p> <p>(user): Expand tests so they check primal, dual and/or primal-dual
infeasible cases as appropriate.
<p> \anchor _todo000378 (user) : treat optional intervals
<p> <p>(user) : Call DecisionVisitor and pass name of variable
<p> \anchor _todo000925 (b/180024054): the following parameters are not tested:
* time_limit
* threads
* scaling<p> \anchor _todo000920 (b/180024054): add tests for:
* threads
* heuristics
* scaling
* lp_algorithm, differentiate between primal and dual simplex. E.g. find a
problem with LP relaxation that is both infeasible and dual infeasible,
disable presolve, and solve. When using primal simplex, we should get
termination reason kInfeasible, but dual simplex should give
kInfeasibleOrUnbounded.
* <p> <p>(b/272268188): test the interaction between cutoff and primal + dual
infeasibility.
<p> \anchor _todo000660 (user): implement the above active node choice rule.<p> \anchor _todo002387 (user): make this implementation the default everywhere.
<p> <p>(user): investigate the code generated by MSVC.
<p> \anchor _todo000006 (user): refine this toplevel comment when this file settles.<p> \anchor _todo000365 (user): Clean up to match other first solution strategies.
<p> \anchor _todo000847 (b/284163180): The current behavior is that in free format header lines
do not start with white space, and data lines must start with at least one
white space.<p> \anchor _todo002234 (user): Expand.
</dd> <dt>
\_setscope operations_research::@142 Namespace \_internalref namespaceoperations__research_1_1_0d142 "operations_research::@142" </dt><dd> \anchor _todo000200 (user): improve code when assume_paths is false (currently does an
expensive n^2 loop).
</dd> <dt>
\_setscope operations_research::AdaptiveParameterValue Class \_internalref classoperations__research_1_1AdaptiveParameterValue "operations_research::AdaptiveParameterValue" </dt><dd> \anchor _todo002366 (user): The current logic work well in practice, but has no strong
theoretical foundation. We should be able to come up with a better understood
formula that converge way faster. It will also be nice to generalize the 0.5
above to a target probability p.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a93bd93f028c18a4b55b30056ef60df44 "operations_research::AddOverflows" (int64_t x, int64_t y)</dt><dd> \anchor _todo002388 (user): consider making some operations overflow-sticky, some others
not, but make an explicit choice throughout.
</dd> <dt>
\_setscope operations_research::AffineRelation Class \_internalref classoperations__research_1_1AffineRelation "operations_research::AffineRelation" </dt><dd> \anchor _todo002367 (user): it might be possible to do something fancier and drop less
relations if all the affine relations are given before hand.
</dd> <dt>
\_setscope operations_research::AffineRelation Member \_internalref classoperations__research_1_1AffineRelation#a42c79bfbcf36db0e14d942a6079a8564 "operations_research::AffineRelation::TryAdd" (int x, int y, int64_t coeff, int64_t offset, bool allow_rep_x, bool allow_rep_y)</dt><dd> \anchor _todo002368 (user): It should be possible to optimize this code block a bit, for
instance depending on the magnitude of new_coeff vs coeff_x, we may already
know that one of the two merge is not possible.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a38cd9519fdea9ef6c87480955852a8c7 "operations_research::ApplyMipPresolveSteps" (const glop::GlopParameters &glop_params, MPModelProto *model, std::vector< std::unique_ptr< glop::Preprocessor > > *for_postsolve, SolverLogger *logger)</dt><dd> \anchor _todo000794 (user): General constraints are currently not supported.
<p> \anchor _todo000795 (user): Remove this back and forth conversion. We could convert
the LinearProgram directly to a CpModelProto, or we could have a custom
implementation of these presolve steps.
<p> \anchor _todo000796 (user): transform the hint instead of disabling presolve.
<p> \anchor _todo000797 (user): Usually it is good to run the ImpliedFreePreprocessor before
this one. However this seems to cause problem on atm20-100.mps. Moreover,
for the conversion, it is better to have tight bounds even if the bound
propagator is supposed to undo what this presolve would have done.
</dd> <dt>
\_setscope operations_research::ArcWithLength Struct \_internalref structoperations__research_1_1ArcWithLength "operations_research::ArcWithLength" </dt><dd> \anchor _todo000619 (user): extend to non-floating lengths.
<p> <p>(user): extend to allow for length functor.
<p> <p>(user): extend to k-shortest paths for k > 1.
</dd> <dt>
\_setscope operations_research::Assignment Member \_internalref classoperations__research_1_1Assignment#ad6ab5aff03cb66b05fcbdff43dde169a "operations_research::Assignment::CopyIntersection" (const Assignment *assignment)</dt><dd> \anchor _todo000121 (user): The current behavior is to copy the objective "prefix"
which fits the notion of lexicographic objectives well. Reconsider if
multiple objectives are used in another context.
</dd> <dt>
\_setscope operations_research::Assignment Member \_internalref classoperations__research_1_1Assignment#aa4afa275944d2cc69a7a252bafc1e311 "operations_research::Assignment::IntVarContainer" () const</dt><dd> \anchor _todo000150 (user): Add element iterators to avoid exposing container class.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a270548116df8ad74e03d376c40025566 "operations_research::AutomaticFirstSolutionStrategy" (bool has_pickup_deliveries, bool has_node_precedences, bool has_single_vehicle_node)</dt><dd> \anchor _todo000351 (user): Make this smarter.
</dd> <dt>
\_setscope operations_research::BaseInactiveNodeToPathOperator Member \_internalref classoperations__research_1_1BaseInactiveNodeToPathOperator#a609668ce9159e0233d2ea4a6c97f9569 "operations_research::BaseInactiveNodeToPathOperator::BaseInactiveNodeToPathOperator" (const std::vector< IntVar * > &vars, const std::vector< IntVar * > &secondary_vars, int number_of_base_nodes, std::function< int(int64_t)> start_empty_path_class, std::function< const std::vector< int > &(int, int)> get_neighbors=nullptr)</dt><dd> \anchor _todo000235 (user): Activate skipping optimal paths.
</dd> <dt>
\_setscope operations_research::BinCapacities Member \_internalref classoperations__research_1_1BinCapacities#ad0a24566a2366a002297ce9fa809fb4b "operations_research::BinCapacities::CheckAdditionsFeasibility" (const std::vector< int > &items, int bin) const</dt><dd> \anchor _todo000374 (user): try to reorder on failure, so that tight dimensions are
checked first.
</dd> <dt>
\_setscope operations_research::Bitmap Member \_internalref classoperations__research_1_1Bitmap#a10079c77d15fd313c09b89b46756d4e3 "operations_research::Bitmap::Resize" (uint32_t size, bool fill=false)</dt><dd> \anchor _todo000063 (user) : optimize next loop.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ab7253ffd8b7aba4b7cb5f981c7627526 "operations_research::BitPos64" (uint64_t pos)</dt><dd> \anchor _todo002370 (user): rename BitPos and BitOffset to something more understandable.
</dd> <dt>
\_setscope operations_research::Bitset64 Member \_internalref classoperations__research_1_1Bitset64#adde7d1500621913ae1f3e71cda4fb502 "operations_research::Bitset64< IndexType >::ClearAndResize" (IndexType size)</dt><dd> \anchor _todo002371 (user): Ideally if a realloc happens, we don't need to copy the old
data...
</dd> <dt>
\_setscope operations_research::BlossomGraph Class \_internalref classoperations__research_1_1BlossomGraph "operations_research::BlossomGraph" </dt><dd> \anchor _todo000700 (user): For now this class does not maintain a second graph of edges
between the trees nor does it maintains priority queue of edges.<p> \anchor _todo000701 (user): For now we use CHECKs in many places to facilitate development.
Switch them to DCHECKs for speed once the code is more stable.
</dd> <dt>
\_setscope operations_research::BlossomGraph Member \_internalref classoperations__research_1_1BlossomGraph#a1cc997de6330ea47db84ebfbc97c3855 "operations_research::BlossomGraph::Augment" (EdgeIndex e)</dt><dd> \anchor _todo000693 (user): Check all dual/slack same after primal op?
<p> \anchor _todo000694 (user): It seems that we may waste some computation since the part of
the tree not in the path between roots can lead to the same Grow()
operations later when one of its node is ratched to a new root.<p> \anchor _todo000695 (user): Reduce this O(num_nodes) complexity. We might be able to
even do O(num_node_in_path) with lazy updates. Note that this operation
will only be performed at most num_initial_unmatched_nodes / 2 times
though.
<p> \anchor _todo000696 (user): This could probably be optimized if needed. But we do usually
iterate a lot more over it than we update it. Note that as long as we use
the same delta for all trees, this is not even needed.
</dd> <dt>
\_setscope operations_research::BlossomGraph Member \_internalref classoperations__research_1_1BlossomGraph#a2efd43d890e6d53cbab9f160b5ecd745 "operations_research::BlossomGraph::ComputeMaxCommonTreeDualDeltaAndResetPrimalEdgeQueue" ()</dt><dd> \anchor _todo000690 (user): Avoid this linear loop.
</dd> <dt>
\_setscope operations_research::BlossomGraph::Edge Member \_internalref structoperations__research_1_1BlossomGraph_1_1Edge#a152f6be1dfb3d3057d875f9371da5a29 "operations_research::BlossomGraph::Edge::tail" </dt><dd> \anchor _todo000707 (user): Consider using node_a/node_b instead to remove the "directed"
meaning. I do need to think a bit more about it though.
</dd> <dt>
\_setscope operations_research::BlossomGraph Member \_internalref classoperations__research_1_1BlossomGraph#a23c2ea31a1b81f23e929abdc839f9153 "operations_research::BlossomGraph::ExpandAllBlossoms" ()</dt><dd> \anchor _todo000698 (user): remove duplication with expand?
</dd> <dt>
\_setscope operations_research::BlossomGraph Member \_internalref classoperations__research_1_1BlossomGraph#aea1e702f3161c4bd45d69ac7ef50d562 "operations_research::BlossomGraph::Initialize" ()</dt><dd> \anchor _todo000685 (user): Code the more advanced "Fractional matching initialization"
heuristic.<p> \anchor _todo000686 (user): Add a preprocessing step that performs the 'forced' matches?
<p> \anchor _todo000687 (user): We might be able to do better for odd min_cost, but then
we might need to scale by 4? think about it.
<p> \anchor _todo000688 (user): Optimize by merging this loop with the one above?
<p> \anchor _todo000689 (user): Reduce the number of loops we do in the initialization. We
could likely just scale the edge cost as we fill them.
</dd> <dt>
\_setscope operations_research::BlossomGraph Member \_internalref classoperations__research_1_1BlossomGraph#a4e57765af9aa45f409d540937922cb15 "operations_research::BlossomGraph::PrimalUpdates" ()</dt><dd> \anchor _todo000691 (user): avoid adding duplicates?
<p> \anchor _todo000692 (user): Avoid doing a O(num_nodes). Also expand all blossom
recursively? I am not sure it is a good heuristic to expand all possible
blossom before trying the other operations though.
</dd> <dt>
\_setscope operations_research::BlossomGraph Member \_internalref classoperations__research_1_1BlossomGraph#af8800c5729866189248b48ea006f2787 "operations_research::BlossomGraph::Shrink" (EdgeIndex e)</dt><dd> \anchor _todo000697 (user): It would be nicer to not to have to read the memory of
the other node at all. It might be possible once we store the
parent edge instead of the parent node since then we will only need
to know if this edges point to a new-internal node or not.
</dd> <dt>
\_setscope operations_research::bop::AssignmentAndConstraintFeasibilityMaintainer Member \_internalref classoperations__research_1_1bop_1_1AssignmentAndConstraintFeasibilityMaintainer#a74b09c69f37b7aee6c511622f13ff935 "operations_research::bop::AssignmentAndConstraintFeasibilityMaintainer::DebugString" () const</dt><dd> \anchor _todo000091 (user): show the backtrack levels.
</dd> <dt>
\_setscope operations_research::bop::AssignmentAndConstraintFeasibilityMaintainer Member \_internalref classoperations__research_1_1bop_1_1AssignmentAndConstraintFeasibilityMaintainer#ab9b52ed71802a8f4ae56d61b3e6f42ea "operations_research::bop::AssignmentAndConstraintFeasibilityMaintainer::PotentialOneFlipRepairs" ()</dt><dd> \anchor _todo000090 (user): If this starts to show-up in a performance profile, we can
easily maintain this hash incrementally.
</dd> <dt>
\_setscope operations_research::bop::BopOptimizerBase Member \_internalref classoperations__research_1_1bop_1_1BopOptimizerBase#a881ed93d8f98879bbbfddf21807fff63ab5cd6094ad1ef99cfb1c8e77da1f59b1 "operations_research::bop::BopOptimizerBase::INFORMATION_FOUND" </dt><dd> \anchor _todo000070 (user): replace by learned_info->IsEmpty()? but we will need to clear
the BopSolution there first.
</dd> <dt>
\_setscope operations_research::bop::BopOptimizerBase Member \_internalref classoperations__research_1_1bop_1_1BopOptimizerBase#a881ed93d8f98879bbbfddf21807fff63 "operations_research::bop::BopOptimizerBase::Status" </dt><dd> \anchor _todo000069 (user): To redesign, some are not needed anymore thanks to the
problem state, e.g. IsOptimal().
</dd> <dt>
\_setscope operations_research::bop::BopRandomFirstSolutionGenerator Class \_internalref classoperations__research_1_1bop_1_1BopRandomFirstSolutionGenerator "operations_research::bop::BopRandomFirstSolutionGenerator" </dt><dd> \anchor _todo000077 (user): Coupled with some Local Search it might be used to diversify
the solutions. To try.
</dd> <dt>
\_setscope operations_research::bop Member \_internalref namespaceoperations__research_1_1bop#aa5e7fc23cf65709ac2894d88db807c57 "operations_research::bop::DEFINE_STRONG_INDEX_TYPE" (SparseIndex)</dt><dd> \anchor _todo000106 (user): Remove.
</dd> <dt>
\_setscope operations_research::bop::IntegralSolver Member \_internalref classoperations__research_1_1bop_1_1IntegralSolver#ade95d98b233882c2b9004ec144ded32e "operations_research::bop::IntegralSolver::Solve" (const glop::LinearProgram &linear_problem, const glop::DenseRow &user_provided_initial_solution)</dt><dd> \anchor _todo000118 (user): Change the API to accept a partial solution instead since the
underlying solver supports it.
</dd> <dt>
\_setscope operations_research::bop::LinearRelaxation Member \_internalref classoperations__research_1_1bop_1_1LinearRelaxation#ae7b5dc2f2554218d68e6013b9a3c10d8 "operations_research::bop::LinearRelaxation::ShouldBeRun" (const ProblemState &problem_state) const override</dt><dd> \anchor _todo000073 (user): also deal with problem_already_solved_
</dd> <dt>
\_setscope operations_research::bop::LocalSearchAssignmentIterator Member \_internalref classoperations__research_1_1bop_1_1LocalSearchAssignmentIterator#a8b33fbbde1b28b4f19eac558f3bcc968 "operations_research::bop::LocalSearchAssignmentIterator::deterministic_time" () const</dt><dd> \anchor _todo000093 (user): The 1.2 multiplier is an approximation only based on the time
spent in the SAT wrapper. So far experiments show a good
correlation with real time, but we might want to be more
accurate.
</dd> <dt>
\_setscope operations_research::bop::LocalSearchAssignmentIterator Member \_internalref classoperations__research_1_1bop_1_1LocalSearchAssignmentIterator#abba388e3e639729c28998d52ecea6a19 "operations_research::bop::LocalSearchAssignmentIterator::NextAssignment" ()</dt><dd> \anchor _todo000092 (user): Perform more experiments with this.
</dd> <dt>
\_setscope operations_research::bop::OneFlipConstraintRepairer Member \_internalref classoperations__research_1_1bop_1_1OneFlipConstraintRepairer#a07e60997ff23293fa7f3b9d21765fb32 "operations_research::bop::OneFlipConstraintRepairer::OneFlipConstraintRepairer" (const sat::LinearBooleanProblem &problem, const AssignmentAndConstraintFeasibilityMaintainer &maintainer, const sat::VariablesAssignment &sat_assignment)</dt><dd> \anchor _todo000097 (user): maybe merge the two classes? maintaining this implicit indices
convention between the two classes sounds like a bad idea.
</dd> <dt>
\_setscope operations_research::bop::OptimizerSelector Member \_internalref classoperations__research_1_1bop_1_1OptimizerSelector#a39afee83d9f173f951fd8bef5668d1cc "operations_research::bop::OptimizerSelector::SelectOptimizer" ()</dt><dd> \anchor _todo000104 (user): Remove this recursive call, even if in practice it's
safe because the max depth is the number of optimizers.
</dd> <dt>
\_setscope operations_research::bop::OptimizerSelector Member \_internalref classoperations__research_1_1bop_1_1OptimizerSelector#a90899a835ba61dd5404514594bac26d1 "operations_research::bop::OptimizerSelector::SetOptimizerRunnability" (OptimizerIndex optimizer_index, bool runnable)</dt><dd> \anchor _todo000105 (user): Maybe we should simply have the notion of selectability here
and let the client handle the logic to decide what optimizer are selectable
or not.
</dd> <dt>
\_setscope operations_research::bop::PortfolioOptimizer Member \_internalref classoperations__research_1_1bop_1_1PortfolioOptimizer#a80a6069365c385e427e6e5a1c08d1757 "operations_research::bop::PortfolioOptimizer::Optimize" (const BopParameters ¶meters, const ProblemState &problem_state, LearnedInfo *learned_info, TimeLimit *time_limit) override</dt><dd> \anchor _todo000100 (user): Is 1 the right value? It might be better to use a percentage
of the gap, or use the same gain as for the second solution.
<p> \anchor _todo000101 (user): don't penalize the SatCoreBasedOptimizer or the
LinearRelaxation when they improve the lower bound.
<p> \anchor _todo000102 <p> \anchor _todo000103 (user): Do we want to re-order the optimizers in the selector when
the status is BopOptimizerBase::INFORMATION_FOUND?
</dd> <dt>
\_setscope operations_research::bop::ProblemState Member \_internalref classoperations__research_1_1bop_1_1ProblemState#a559199c417440cd27d38fc73ce4eb3f0 "operations_research::bop::ProblemState::GetLearnedInfo" () const</dt><dd> \anchor _todo000071 (user): In the current implementation the learned information only
contains binary clauses added since the last call to
SynchronizationDone().
Add an iterator on the sat::BinaryClauseManager.
</dd> <dt>
\_setscope operations_research::bop::ProblemState Member \_internalref classoperations__research_1_1bop_1_1ProblemState#a66e1a0e14cfd6b3310237e4243df1295 "operations_research::bop::ProblemState::MergeLearnedInfo" (const LearnedInfo &learned_info, BopOptimizerBase::Status optimization_status)</dt><dd> \anchor _todo000068 (user): refactor this to not rely on the optimization status.
All the information can be encoded in the learned_info bounds.
</dd> <dt>
\_setscope operations_research::bop::RelationGraphBasedNeighborhood Member \_internalref classoperations__research_1_1bop_1_1RelationGraphBasedNeighborhood#a325429e8a64a26196122aa1b0e430cdb "operations_research::bop::RelationGraphBasedNeighborhood::RelationGraphBasedNeighborhood" (const sat::LinearBooleanProblem &problem, absl::BitGenRef random)</dt><dd> \anchor _todo000082 (user): Factor this out with the similar factor in
ConstraintBasedNeighborhood? also maybe a better approach is to order the
constraint, and stop the neighborhood extension without considering all of
them.
</dd> <dt>
\_setscope operations_research::bop::SatCoreBasedOptimizer Class \_internalref classoperations__research_1_1bop_1_1SatCoreBasedOptimizer "operations_research::bop::SatCoreBasedOptimizer" </dt><dd> \anchor _todo000108 (user): Merge this with the code in sat/optimization.cc
</dd> <dt>
\_setscope operations_research::bop::SatCoreBasedOptimizer Member \_internalref classoperations__research_1_1bop_1_1SatCoreBasedOptimizer#aa4bc0effba94384800ed5500479d4e6a "operations_research::bop::SatCoreBasedOptimizer::Optimize" (const BopParameters ¶meters, const ProblemState &problem_state, LearnedInfo *learned_info, TimeLimit *time_limit) override</dt><dd> \anchor _todo000107 (user): Check that this cannot fail because of the conflict limit.
</dd> <dt>
\_setscope operations_research::bop::SatWrapper Class \_internalref classoperations__research_1_1bop_1_1SatWrapper "operations_research::bop::SatWrapper" </dt><dd> \anchor _todo000096 (user): remove? the meat of the logic is used in just one place, so I am
not sure having this extra layer improve the readability.
</dd> <dt>
\_setscope operations_research::BopInterface Member \_internalref classoperations__research_1_1BopInterface#ada6578145939501210ef6b92ca38158d "operations_research::BopInterface::ExtractNewConstraints" () override</dt><dd> \anchor _todo000736 (user): remove duplication with GlopInterface.
</dd> <dt>
\_setscope operations_research::BopInterface Member \_internalref classoperations__research_1_1BopInterface#a7aaa64ff52a59fb3e02dde9e52897ace "operations_research::BopInterface::ExtractNewVariables" () override</dt><dd> \anchor _todo000735 (user): remove duplication with GlopInterface.
</dd> <dt>
\_setscope operations_research::BopInterface Member \_internalref classoperations__research_1_1BopInterface#a9bd4d93025988cd4a244584d930b8ff8 "operations_research::BopInterface::ExtractObjective" () override</dt><dd> \anchor _todo000737 (user): remove duplication with GlopInterface.
</dd> <dt>
\_setscope operations_research::BopInterface Member \_internalref classoperations__research_1_1BopInterface#ac52f933217a15933ccc9d816712e85f7 "operations_research::BopInterface::SetPresolveMode" (int value) override</dt><dd> \anchor _todo000738 (user): add this to BopParameters.
<p> \anchor _todo000739 (user): add this to BopParameters.
</dd> <dt>
\_setscope operations_research::BopInterface Member \_internalref classoperations__research_1_1BopInterface#afd586dcfbf76c853a9331113cea5ad2f "operations_research::BopInterface::Solve" (const MPSolverParameters ¶m) override</dt><dd> \anchor _todo000733 (user): Implement the row status.
<p> \anchor _todo000732 (user): Implement the column status.
</dd> <dt>
\_setscope operations_research::BopInterface Member \_internalref classoperations__research_1_1BopInterface#a8055a5ae37344bb12601db78c75336ca "operations_research::BopInterface::SolverVersion" () const override</dt><dd> \anchor _todo000734 (user): Decide how to version bop.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#aacf1f78a82fb54975d703e8f079cafa2 "operations_research::BuildKruskalMinimumSpanningTreeFromSortedArcs" (const Graph &graph, absl::Span< const typename Graph::ArcIndex > sorted_arcs)</dt><dd> \anchor _todo000680 (user): Add a global Minimum Spanning Tree API automatically switching
between Prim and Kruskal depending on problem size.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#adfcad7c607afe2de123ac91fcd2b87c0 "operations_research::CapProdGeneric" (int64_t x, int64_t y)</dt><dd> \anchor _todo002389 (user): avoid this by writing function Log2(a) with Log2(0) == -1.
</dd> <dt>
\_setscope operations_research::CBCInterface Member \_internalref classoperations__research_1_1CBCInterface#af820a38fd9b79c6bccdf806ff44df433 "operations_research::CBCInterface::ExtractModel" ()</dt><dd> \anchor _todo000741 (user): separate the solve from the model extraction.
</dd> <dt>
\_setscope operations_research::CBCInterface Member \_internalref classoperations__research_1_1CBCInterface#abe31f5b2faa04f2e7d0a82b2f7c56eba "operations_research::CBCInterface::SetVariableInteger" (int var_index, bool integer) override</dt><dd> \anchor _todo000740 (user) : Check if this is actually a change.
</dd> <dt>
\_setscope operations_research::CBCInterface Member \_internalref classoperations__research_1_1CBCInterface#aff8df81038ade1c6d8ff118dbcf92ff2 "operations_research::CBCInterface::underlying_solver" () override</dt><dd> \anchor _todo000742 (user): Maybe we should expose the CbcModel build from osi_
instead, but a new CbcModel is built every time Solve is called,
so it is not possible right now.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a6a5db12c8eb55529c5717db21d40f856 "operations_research::CeilRatio" (int64_t value, int64_t positive_coeff)</dt><dd> \anchor _todo002390 (user): Use MathUtil::CeilOfRatio / FloorOfRatio instead.
</dd> <dt>
\_setscope operations_research::CheapestInsertionFilteredHeuristic Member \_internalref classoperations__research_1_1CheapestInsertionFilteredHeuristic#aabcdb4b93d8aed00bc35f8f04a3c5f0a "operations_research::CheapestInsertionFilteredHeuristic::ComputeStartEndDistanceForVehicles" (const std::vector< int > &vehicles)</dt><dd> \anchor _todo000353 (user): consider checking search limits.
</dd> <dt>
\_setscope operations_research::CheapestInsertionFilteredHeuristic Member \_internalref classoperations__research_1_1CheapestInsertionFilteredHeuristic#a1a109ae320b663d295dfdfc68f608810 "operations_research::CheapestInsertionFilteredHeuristic::GetInsertionCostForNodeAtPosition" (int64_t node_to_insert, int64_t insert_after, int64_t insert_before, int vehicle) const</dt><dd> \anchor _todo000370 (user): Replace 'insert_before' and 'insert_after' by 'predecessor'
and 'successor' in the code.
</dd> <dt>
\_setscope operations_research::ChristofidesFilteredHeuristic Member \_internalref classoperations__research_1_1ChristofidesFilteredHeuristic#a30f60a5304f5bd801ece16fb0868b0fb "operations_research::ChristofidesFilteredHeuristic::BuildSolutionInternal" () override</dt><dd> \anchor _todo000364 (user): Investigate if sorting paths per cost improves solutions.
<p> \anchor _todo000363 (user): Investigate if ChristofidesPathSolver should not
return a status to bail out fast in case of problem.
<p> \anchor _todo000361 (user): Support pickup & delivery.
<p> \anchor _todo000362 (user): Add robustness to fixed arcs by collapsing them into meta-
nodes.
</dd> <dt>
\_setscope operations_research::ChristofidesPathSolver Member \_internalref classoperations__research_1_1ChristofidesPathSolver#a76c636e1d48da64087686dd06bc45519 "operations_research::ChristofidesPathSolver< CostType, ArcIndex, NodeIndex, CostFunction >::SetMatchingAlgorithm" (MatchingAlgorithm matching)</dt><dd> \anchor _todo000615 (user): Change the default when minimum matching gets faster.
</dd> <dt>
\_setscope operations_research::ChristofidesPathSolver Member \_internalref classoperations__research_1_1ChristofidesPathSolver#a0fd40e5b4dd3c4d2eec044aafc9cdc7a "operations_research::ChristofidesPathSolver< CostType, ArcIndex, NodeIndex, CostFunction >::Solve" ()</dt><dd> \anchor _todo000613 (user): Make this code available as an independent algorithm.
<p> \anchor _todo000614 (user): Cost caching was added and can gain up to 20% but
increases memory usage; see if we can avoid caching.
</dd> <dt>
\_setscope operations_research::CLPInterface Member \_internalref classoperations__research_1_1CLPInterface#adbecc3c53101ed075d7078a7ea8f3e19 "operations_research::CLPInterface::ExtractNewVariables" () override</dt><dd> \anchor _todo000744 (user): This could perhaps be made slightly faster by
iterating through old constraints, constructing by hand the
column-major representation of the addition to them and call
clp_->addColumns. But this is good enough for now.
Create new variables.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a53bf12f941f978cc1b1b985816c1fbdf "operations_research::ComputeMinimumWeightMatchingWithMIP" (const GraphType &graph, const WeightFunctionType &weight)</dt><dd> \anchor _todo000612 (user): Handle infeasible cases if this algorithm is used outside of
Christofides.
</dd> <dt>
\_setscope operations_research::ConstrainedShortestPathsOnDagWrapper Member \_internalref classoperations__research_1_1ConstrainedShortestPathsOnDagWrapper#a99484695ce9be38a707ce339c47060c5 "operations_research::ConstrainedShortestPathsOnDagWrapper< GraphType >::RunConstrainedShortestPathOnDag" ()</dt><dd> \anchor _todo000617 (b/314756645): Include lower bound on the resources to
increase pruning.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a25f46b686d6f253f53dc77ac9f52b4b6 "operations_research::ConvertFlowModelToDimacs" (const FlowModelProto &flow_model, std::string *dimacs)</dt><dd> \anchor _todo000713 (user): This currently only works for min cost flow problem.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#acb9df89a57d7e6c160136db67b224b88 "operations_research::ConvexMinimum" (absl::Span< const Point > sorted_points, std::function< Value(Point)> f)</dt><dd> \anchor _todo000002 (user): replace std::function by absl::FunctionRef here and in
BinarySearch().
<p> \anchor _todo000001 (user): Some relevant optimizations:
- Abort early if we know a lower bound on the min.
- Seed with a starting point if we know one.
- We technically do not need the points to be sorted and can use
linear-time median computation to speed this up.</dd> <dt>
\_setscope operations_research::CplexInterface Member \_internalref classoperations__research_1_1CplexInterface#a6dfd72260599acdb0d30d0eb612a9b2c "operations_research::CplexInterface::ExtractNewVariables" ()</dt><dd> \anchor _todo000746 : Use a bitarray to flag the constraints that actually
intersect new variables?
</dd> <dt>
\_setscope operations_research::CplexInterface Member \_internalref classoperations__research_1_1CplexInterface#ade9838d567be0055711f0d0246878123 "operations_research::CplexInterface::SetScalingMode" (int value)</dt><dd> \anchor _todo000747 : 0 is equilibrium scaling (the default), CPLEX also supports
</dd> <dt>
\_setscope operations_research::CplexInterface Member \_internalref classoperations__research_1_1CplexInterface#a6f29640b71cf1b2be18d08c4888d654f "operations_research::CplexInterface::SetVariableInteger" (int var_index, bool integer)</dt><dd> \anchor _todo000745 : Should we check the current type and don't do anything
in case the type does not change?
</dd> <dt>
\_setscope operations_research::Cross Member \_internalref classoperations__research_1_1Cross#aebc322e8525f142b40271ce61f2db26f "operations_research::Cross::MakeNeighbor" () override</dt><dd> \anchor _todo000216 (user): When neighbors are considered, explore if having two
versions of Cross makes sense, one exchanging path starts, the other
path ends. Rationale: neighborhoods might not be symmetric. In practice,
in particular when used through RoutingModel, neighborhoods are
actually symmetric.
</dd> <dt>
\_setscope operations_research::CVRPToursParser Member \_internalref classoperations__research_1_1CVRPToursParser#aa36bf9878697f417c237563de888fe97 "operations_research::CVRPToursParser::LoadFile" (const std::string &file_name)</dt><dd> \anchor _todo001025 (user): Return false when issues were encountered while parsing the
file.
</dd> <dt>
\_setscope operations_research::DemonProfiler Member \_internalref classoperations__research_1_1DemonProfiler#a7b7c6355eb1daf5a3db8f0d575947ed2 "operations_research::DemonProfiler::CurrentTime" () const</dt><dd> \anchor _todo000163 (user): rename and return nanoseconds.
</dd> <dt>
\_setscope operations_research::DimensionChecker Member \_internalref classoperations__research_1_1DimensionChecker#a0f3d75f9157801c9a32ab3e5d9bdc23e "operations_research::DimensionChecker::DimensionChecker" (const PathState *path_state, std::vector< Interval > path_capacity, std::vector< int > path_class, std::vector< std::function< Interval(int64_t, int64_t)> > demand_per_path_class, std::vector< Interval > node_capacity, int min_range_size_for_riq=kOptimalMinRangeSizeForRIQ)</dt><dd> \anchor _todo000159 (user): the addition of kMinRangeSizeForRIQ slowed down Check().
See if using a template parameter makes it faster.
</dd> <dt>
\_setscope operations_research::DimensionCumulOptimizerCore Member \_internalref classoperations__research_1_1DimensionCumulOptimizerCore#a124f8416552eec51fea7c3f0f47d722b "operations_research::DimensionCumulOptimizerCore::Optimize" (const std::function< int64_t(int64_t)> &next_accessor, const std::vector< RouteDimensionTravelInfo > &dimension_travel_info_per_route, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *cumul_values, std::vector< int64_t > *break_values, std::vector< std::vector< int > > *resource_indices_per_group, int64_t *cost_without_transits, int64_t *transit_cost, bool clear_lp=true, bool optimize_resource_assignment=true)</dt><dd> \anchor _todo000326 (user): In case the status is RELAXED_OPTIMAL_ONLY, check we can
safely avoid filling variable and cost values.
</dd> <dt>
\_setscope operations_research::DimensionCumulOptimizerCore Member \_internalref classoperations__research_1_1DimensionCumulOptimizerCore#a5a239314a69e35f6411905cd4bebb6d8 "operations_research::DimensionCumulOptimizerCore::OptimizeAndPack" (const std::function< int64_t(int64_t)> &next_accessor, const std::vector< RouteDimensionTravelInfo > &dimension_travel_info_per_route, RoutingLinearSolverWrapper *solver, std::vector< int64_t > *cumul_values, std::vector< int64_t > *break_values)</dt><dd> \anchor _todo000327 (user): In case the status is RELAXED_OPTIMAL_ONLY, check we can
safely avoid filling variable values.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ad0b44ed99c3501d7a797dfa6ac52714f "operations_research::DisplayPlan" (const operations_research::RoutingIndexManager &manager, const operations_research::RoutingModel &routing, const operations_research::Assignment &plan, bool use_same_vehicle_costs, int64_t max_nodes_per_group, int64_t same_vehicle_cost, const operations_research::RoutingDimension &capacity_dimension, const operations_research::RoutingDimension &time_dimension)</dt><dd> \anchor _todo001020 (user): Move the display code to the routing library.
</dd> <dt>
\_setscope operations_research::DistributionStat Member \_internalref classoperations__research_1_1DistributionStat#a68349bcba1db1a5a68ebd1d855bdd078 "operations_research::DistributionStat::StdDeviation" () const</dt><dd> \anchor _todo002400 (user): We could also use on top the Kahan summation algorithm to be
even more precise but a bit slower too.
</dd> <dt>
\_setscope operations_research::Domain Member \_internalref classoperations__research_1_1Domain#a714a1473bb78dab3195bd5cd5e90af42 "operations_research::Domain::AdditionWith" (const Domain &domain) const</dt><dd> \anchor _todo002393 (user): Use a better algorithm.
</dd> <dt>
\_setscope operations_research::Domain Member \_internalref classoperations__research_1_1Domain#afea26857db7d2e50a267c9d9d5ceb661 "operations_research::Domain::ClosestValue" (int64_t wanted) const</dt><dd> \anchor _todo002391 (user): Use std::upper_bound() like in ValueAtOrBefore() ?
</dd> <dt>
\_setscope operations_research::Domain Member \_internalref classoperations__research_1_1Domain#a8de91c6ec98c4eaa9ec6c7e1f5e26d71 "operations_research::Domain::Distance" (int64_t value) const</dt><dd> \anchor _todo002392 (user): Deal with overflow.
</dd> <dt>
\_setscope operations_research::DynamicPartition Class \_internalref classoperations__research_1_1DynamicPartition "operations_research::DynamicPartition" </dt><dd> \anchor _todo000007 (user): rename this to BacktrackableSplittingPartition.
</dd> <dt>
\_setscope operations_research::DynamicPartition Member \_internalref classoperations__research_1_1DynamicPartition#ae0789ce355b93a5161e63666b4467e67 "operations_research::DynamicPartition::DynamicPartition" (const std::vector< int > &initial_part_of_element)</dt><dd> \anchor _todo000003 (user): either remove this or factor it out if it can be used
elsewhere.
</dd> <dt>
\_setscope operations_research::DynamicPartition Member \_internalref classoperations__research_1_1DynamicPartition#ab82a2915429e5c6626c9187ed85e7064 "operations_research::DynamicPartition::Refine" (absl::Span< const int > distinguished_subset)</dt><dd> \anchor _todo000004 (user): optimize the common singleton case.
<p> \anchor _todo000005 (user): automatically switch to an O(N) sort when it's faster
than this one, which is O(K log K) with K = tmp_affected_parts_.size().
<p> \anchor _todo000008 (user): the graph symmetry finder could probably benefit a lot from
keeping track of one additional bit of information for each part that
remains unchanged by a Refine() operation: was that part entirely <em>in</em>
the distinguished subset or entirely <em>out</em>?
</dd> <dt>
\_setscope operations_research::DynamicPermutation Member \_internalref classoperations__research_1_1DynamicPermutation#a529b7a5b760666c049da283212991a5b "operations_research::DynamicPermutation::LooseEnds" () const</dt><dd> \anchor _todo000009 (user): use a faster underlying container like SparseBitSet, and
tweak this API accordingly.
</dd> <dt>
\_setscope operations_research::EbertGraphBase Member \_internalref classoperations__research_1_1EbertGraphBase#a7adcbbf1af098a96abf7a3397246304d "operations_research::EbertGraphBase< NodeIndexType, ArcIndexType, DerivedGraph >::GroupForwardArcsByFunctor" (const ArcIndexTypeStrictWeakOrderingFunctor &compare, PermutationCycleHandler< ArcIndexType > *annotation_handler)</dt><dd> \anchor _todo000624 (user): Configure SWIG to handle the GroupForwardArcsByFunctor
member template and the CycleHandlerForAnnotatedArcs class.
</dd> <dt>
\_setscope operations_research::ElementIterator Class \_internalref classoperations__research_1_1ElementIterator "operations_research::ElementIterator< Set >" </dt><dd> \anchor _todo000638 (user): Move the Set-related classbelow to util/bitset.h
Iterates over the elements of a set represented as an unsigned integer,
starting from the smallest element. (See the class Set<Integer> below.)
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ab0da8bffc5e8eafc798d8b3b1750f05b "operations_research::FillPathEvaluation" (const std::vector< int64_t > &path, const RoutingModel::TransitCallback2 &evaluator, std::vector< int64_t > *values)</dt><dd> \anchor _todo000282 (user): Apply -pointer-following.
</dd> <dt>
\_setscope operations_research::FilteredHeuristicLocalSearchOperator Class \_internalref classoperations__research_1_1FilteredHeuristicLocalSearchOperator "operations_research::FilteredHeuristicLocalSearchOperator" </dt><dd> \anchor _todo000323 (user): Put these methods in an object with helper methods instead
of adding a layer to the class hierarchy.
</dd> <dt>
\_setscope operations_research::FilteredHeuristicLocalSearchOperator Member \_internalref classoperations__research_1_1FilteredHeuristicLocalSearchOperator#a27a42fcdb24320190aa6760ab0aa2c7a "operations_research::FilteredHeuristicLocalSearchOperator::model_" </dt><dd> \anchor _todo000324 (user): Remove the dependency from RoutingModel by storing an
IntVarFilteredHeuristic here instead and storing information on path
start/ends like PathOperator does (instead of relying on the model).
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ae4ee4d82cf625670cdc1f52197454654 "operations_research::FindFeasibilityErrorInSolutionHint" (const MPModelProto &model, double tolerance)</dt><dd> \anchor _todo000783 (user): Add a general FindFeasibilityErrorInSolution() and factor out the
common code.
</dd> <dt>
\_setscope operations_research::FindOneNeighbor Member \_internalref classoperations__research_1_1FindOneNeighbor#ae778e45052fc69775bc50b2d12294a4c "operations_research::FindOneNeighbor::FindOneNeighbor" (Assignment *assignment, IntVar *objective, SolutionPool *pool, LocalSearchOperator *ls_operator, DecisionBuilder *sub_decision_builder, const RegularLimit *limit, LocalSearchFilterManager *filter_manager)</dt><dd> \anchor _todo000227 (user): Support skipping neighborhood checks with LNS (at least on
the non-LNS operators).
<p> \anchor _todo000226 (user): Support skipping neighborhood checks for limits accepting
more than one solution (e.g. best accept). For now re-enabling systematic
checks.
</dd> <dt>
\_setscope operations_research::FindOneNeighbor Member \_internalref classoperations__research_1_1FindOneNeighbor#a25667f46f98b5158a6d89bcf93a07b46 "operations_research::FindOneNeighbor::Next" (Solver *solver) override</dt><dd> \anchor _todo000231 (user): Restore state of local search operators to
make sure we are exploring neighbors in the same order. This can
affect the local optimum found.
<p> \anchor _todo000228 (user) : SyncNeed(assignment_) ?
<p> \anchor _todo000229 (user): Don't call both if no filter is incremental and one
of them returned false.
<p> \anchor _todo000232 (user): Compare assignments in addition to their cost.
<p> \anchor _todo000230 (user): support the case were limit_ accepts more than
one solution (e.g. best accept).
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a108e0d0f765ed56abc079b49c521915b "operations_research::FormatStatistic" (absl::string_view name, T value, RoutingOutputFormat format)</dt><dd> \anchor _todo001023 (user): think about using an enum instead of names (or even a
full-fledged struct/class) for the various types of fields.
</dd> <dt>
\_setscope operations_research::ForwardStaticGraph::CycleHandlerForAnnotatedArcs Class \_internalref classoperations__research_1_1ForwardStaticGraph_1_1CycleHandlerForAnnotatedArcs "operations_research::ForwardStaticGraph< NodeIndexType, ArcIndexType >::CycleHandlerForAnnotatedArcs" </dt><dd> \anchor _todo000622 (user): Configure SWIG to handle the
CycleHandlerForAnnotatedArcs class.
</dd> <dt>
\_setscope operations_research::ForwardStaticGraph Member \_internalref classoperations__research_1_1ForwardStaticGraph#a299d30373ebbfcb70fc84ecc66d95b92 "operations_research::ForwardStaticGraph< NodeIndexType, ArcIndexType >::ForwardStaticGraph" (const NodeIndexType num_nodes, const ArcIndexType num_arcs, const bool sort_arcs_by_head, std::vector< std::pair< NodeIndexType, NodeIndexType > > *client_input_arcs, operations_research::PermutationCycleHandler< ArcIndexType > *const client_cycle_handler)</dt><dd> \anchor _todo000623 (user): For some reason, SWIG breaks if the
operations_research namespace is not explicit in the
following argument declaration.
</dd> <dt>
\_setscope operations_research::fz::Constraint Member \_internalref structoperations__research_1_1fz_1_1Constraint#a4d53b3107ef0dbfb3e99a52a2f4c0d42 "operations_research::fz::Constraint::MarkAsInactive" ()</dt><dd> \anchor _todo000407 (user): Reclaim arguments and memory.
</dd> <dt>
\_setscope operations_research::fz::Domain Struct \_internalref structoperations__research_1_1fz_1_1Domain "operations_research::fz::Domain" </dt><dd> \anchor _todo000409 (user): Rework domains, all int64_t should be kintmin..kint64max.
It is a bit tricky though as we must take care of overflows.
If is_a_set is true, then this domain has a set semantics. For a set
variable, any subset of the initial set of values is a valid assignment,
instead of exactly one value.
</dd> <dt>
\_setscope operations_research::fz::Domain Member \_internalref structoperations__research_1_1fz_1_1Domain#ac4d428774d29f823cc82a1e9094f1926 "operations_research::fz::Domain::HasOneValue" () const</dt><dd> \anchor _todo000411 (user): Do we need SetOfFloats() ?
</dd> <dt>
\_setscope operations_research::fz::Domain Member \_internalref structoperations__research_1_1fz_1_1Domain#ae0c523fec5cdb2c506835d037c78557c "operations_research::fz::Domain::IntersectWithListOfIntegers" (absl::Span< const int64_t > integers)</dt><dd> \anchor _todo000405 (user): Investigate faster code for small arrays.
</dd> <dt>
\_setscope operations_research::fz::Domain Member \_internalref structoperations__research_1_1fz_1_1Domain#ae4c771e4304fd0443a538c84d3c62870 "operations_research::fz::Domain::OverlapsIntList" (const std::vector< int64_t > &vec) const</dt><dd> \anchor _todo000406 (user): Better algorithm, sort and compare increasingly.
</dd> <dt>
\_setscope operations_research::fz::LexerInfo Struct \_internalref structoperations__research_1_1fz_1_1LexerInfo "operations_research::fz::LexerInfo" </dt><dd> \anchor _todo000419 (user): Use std::unique_ptr<vector< >> to ease memory management.
</dd> <dt>
\_setscope operations_research::fz Member \_internalref namespaceoperations__research_1_1fz#a0d0d1d18eea7879af81671f8395b8b1d "operations_research::fz::Lookup" (const std::vector< T > &v, int index)</dt><dd> \anchor _todo000418 (user): replace this by a macro for better logging.
</dd> <dt>
\_setscope operations_research::fz::Model Member \_internalref classoperations__research_1_1fz_1_1Model#affdfad9a0c88744ef4cfe7c80adc4fb1 "operations_research::fz::Model::AddConstant" (int64_t value)</dt><dd> \anchor _todo000408 (user): Create only once constant per value.
</dd> <dt>
\_setscope operations_research::fz::ModelStatistics Class \_internalref classoperations__research_1_1fz_1_1ModelStatistics "operations_research::fz::ModelStatistics" </dt><dd> \anchor _todo000410 (user): Clean up API to pass a Model* in argument.
</dd> <dt>
\_setscope operations_research::fz::Presolver Class \_internalref classoperations__research_1_1fz_1_1Presolver "operations_research::fz::Presolver" </dt><dd> \anchor _todo000423 (user): Error reporting of unfeasible models.
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#a92fbc9576b457ceddeb21395181b3273 "operations_research::GenericMaxFlow< Graph >::check_result_" </dt><dd> \anchor _todo000667 (user): Make the check more exhaustive by checking the optimality?
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#ad7892ad5aa8338015f320267fb7f298f "operations_research::GenericMaxFlow< Graph >::GetSinkSideMinCut" (std::vector< NodeIndex > *result)</dt><dd> \anchor _todo000666 (user): In the two-phases algorithm, we can get this minimum cut
without doing the second phase. Add an option for this if there is a need
to, note that the second phase is pretty fast so the gain will be small.
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#ad3925f2137b18b1555563ed149ada740 "operations_research::GenericMaxFlow< Graph >::GlobalUpdate" ()</dt><dd> \anchor _todo000653 (user): Investigate more and maybe write a publication :)
<p> \anchor _todo000654 (user): This is another argument for another anti-overflow algorithm.
<p> \anchor _todo000652 (user): By using more memory we can speed this up quite a bit by
avoiding to take the opposite arc here, too options:
- if (residual_arc_capacity_[arc] != arc_capacity_[arc])
- if (opposite_arc_is_admissible_[arc]) ///< need updates.
Experiment with the first option shows more than 10% gain on this
function running time, which is the bottleneck on many instances.
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#a20139b839cd5764939afc8df968a2484 "operations_research::GenericMaxFlow< Graph >::InitializePreflow" ()</dt><dd> \anchor _todo000651 (user): find a way to make the re-solving incremental (not an obvious
task, and there has not been a lot of literature on the subject.)
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#aa96647a33c0a0898055642bd6d039f83 "operations_research::GenericMaxFlow< Graph >::kMaxFlowQuantity" </dt><dd> \anchor _todo000659 (user): moves this code out of a .cc file and include it at the end of
the header so it can work with any graph implementation ?
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#a1c31c96effb1f91f800895be2339045b "operations_research::GenericMaxFlow< Graph >::PushFlow" (FlowQuantity flow, ArcIndex arc)</dt><dd> \anchor _todo000655 (user): Do not allow a zero flow after fixing the UniformMaxFlow code.
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#a1061c1ce94ccc0d379390b8542bfaa23 "operations_research::GenericMaxFlow< Graph >::Refine" ()</dt><dd> \anchor _todo000657 (user): The code below is buggy when more than kMaxFlowQuantity can be
pushed out of the source (i.e. when we loop more than once in the while()).
This is not critical, since this code is not used in the default algorithm
computation. The issue is twofold:
- InitializeActiveNodeContainer() doesn't push the nodes in
the correct order.
- PushFlowExcessBackToSource() may break the node potential properties, and
we will need a call to GlobalUpdate() to fix that.
<p> \anchor _todo000656 (user): This may not be the most efficient algorithm if we need to loop
many times. An alternative may be to handle the source like the other nodes
in the algorithm, initially putting an excess of kMaxFlowQuantity on it,
and making the source active like any other node with positive excess. To
investigate.</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#a91d754521a7d43dd215e5d6200ec1062 "operations_research::GenericMaxFlow< Graph >::RefineWithGlobalUpdate" ()</dt><dd> \anchor _todo000658 (user): This should be graph_->num_nodes(), but ebert graph does not
have a correct size if the highest index nodes have no arcs.
</dd> <dt>
\_setscope operations_research::GenericMaxFlow Member \_internalref classoperations__research_1_1GenericMaxFlow#a05f2661c573eb445212f4eddd694fc2f "operations_research::GenericMaxFlow< Graph >::SetArcCapacity" (ArcIndex arc, FlowQuantity new_capacity)</dt><dd> \anchor _todo000650 (user): The easiest is probably to allow negative node excess in
other places than the source, but the current implementation does not
deal with this.
</dd> <dt>
\_setscope operations_research::GenericMinCostFlow Class \_internalref classoperations__research_1_1GenericMinCostFlow "operations_research::GenericMinCostFlow< Graph, ArcFlowType, ArcScaledCostType >" </dt><dd> \anchor _todo000678 (user): Avoid using the globally defined type CostValue and FlowQuantity.
Also uses the Arc*Type where there is no risk of overflow in more places.
</dd> <dt>
\_setscope operations_research::GenericMinCostFlow Member \_internalref classoperations__research_1_1GenericMinCostFlow#a342b29b5fe3d4a96bfc0c7d850e05d46 "operations_research::GenericMinCostFlow< Graph, ArcFlowType, ArcScaledCostType >::CheckFeasibility" (std::vector< NodeIndex > *infeasible_supply_node, std::vector< NodeIndex > *infeasible_demand_node)</dt><dd> \anchor _todo000669 (user): make it possible to share a graph by MaxFlow and MinCostFlow.
For this it is necessary to make StarGraph resizable.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a838df3808f198b2cbc781e426a601b29 "operations_research::GetBestScalingOfDoublesToInt64" (const std::vector< double > &input, int64_t max_absolute_sum, double *scaling_factor, double *max_relative_coeff_error)</dt><dd> \anchor _todo002375 (user): incorporate the gcd computation here? The issue is that I am
not sure if I just do factor /= gcd that round(x * factor) will be the same.
</dd> <dt>
\_setscope operations_research::GlobalCheapestInsertionFilteredHeuristic Member \_internalref classoperations__research_1_1GlobalCheapestInsertionFilteredHeuristic#abe76b53e07ae6db10cda5c6fd70d0001 "operations_research::GlobalCheapestInsertionFilteredHeuristic::BuildSolutionInternal" () override</dt><dd> \anchor _todo000354 (user): Adapt the pair insertions to also support seed and
sequential insertion.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#aeacc29c42c7fddda875937d3bdfc7e08 "operations_research::glop::ABSL_DEPRECATED" ("Use the direct methods instead") MPSReader</dt><dd> \anchor _todo000846 (user): Remove the MPSReader class.
</dd> <dt>
\_setscope operations_research::glop::AddSlackVariablesPreprocessor Class \_internalref classoperations__research_1_1glop_1_1AddSlackVariablesPreprocessor "operations_research::glop::AddSlackVariablesPreprocessor" </dt><dd> \anchor _todo000513 (user): Do not require this step to talk to the revised simplex. On large
LPs like supportcase11.mps, this step alone can add 1.5 GB to the solver peak
memory for no good reason. The internal matrix representation used in glop is
a lot more efficient, and there is no point keeping the slacks in
LinearProgram. It is also bad for incrementaly modifying the LP.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#acf14406acccf01da7c2dd2fa1c66425e "operations_research::glop::ApplyPermutation" (const Permutation< IndexType > &perm, const ITIVectorType &b, ITIVectorType *result)</dt><dd> \anchor _todo000854 (user): Try to restrict this method to using the same integer type in
the permutation and for the vector indices, i.e.
IndexType == ITIVectorType::IndexType. Some client code will need to be
refactored.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#aac6525bf47674e01c5d51e956ce13a63 "operations_research::glop::AreFirstColumnsAndRowsExactlyEquals" (RowIndex num_rows, ColIndex num_cols, const SparseMatrix &matrix_a, const CompactSparseMatrix &matrix_b)</dt><dd> \anchor _todo000843 (user): Also DCHECK() that matrix_b is ordered by rows.
</dd> <dt>
\_setscope operations_research::glop::BasisFactorization Member \_internalref classoperations__research_1_1glop_1_1BasisFactorization#a370b080a5be3e81960457e53261e7cd5 "operations_research::glop::BasisFactorization::ComputeInitialBasis" (const std::vector< ColIndex > &candidates)</dt><dd> \anchor _todo000428 (user): This "double" factorization is a bit inefficient, and we should
probably Initialize() right away the factorization with the new basis, but
more code is needed for that. It is also not that easy also because we want
to permute all the added slack first.
</dd> <dt>
\_setscope operations_research::glop::BasisFactorization Member \_internalref classoperations__research_1_1glop_1_1BasisFactorization#af2eba683b05901eb982dcade3fda53d3 "operations_research::glop::BasisFactorization::ComputeInverseOneNorm" () const</dt><dd> \anchor _todo000426 (user): try to merge the computation of the norm of inverses
with that of MatrixView. Maybe use a wrapper class for InverseMatrix.
</dd> <dt>
\_setscope operations_research::glop::BasisFactorization Member \_internalref classoperations__research_1_1glop_1_1BasisFactorization#a90e327f8ea7f4594bab0686230735287 "operations_research::glop::BasisFactorization::RightSolveForProblemColumn" (ColIndex col, ScatteredColumn *d) const</dt><dd> \anchor _todo000425 (user): if right_pool_mapping_[col] != kInvalidCol, we can reuse it and
just apply the last rank one update since it was computed.
</dd> <dt>
\_setscope operations_research::glop::BasisState Struct \_internalref structoperations__research_1_1glop_1_1BasisState "operations_research::glop::BasisState" </dt><dd> \anchor _todo000607 (user): Introduce another state class to store a complete state of the
solver. Using this state and the original linear program, the solver can be
restarted with as little time overhead as possible. This is especially useful
for strong branching in a MIP context.
</dd> <dt>
\_setscope operations_research::glop::BasisState Member \_internalref structoperations__research_1_1glop_1_1BasisState#a8403627807a2ba65e69b8fb58061293f "operations_research::glop::BasisState::statuses" </dt><dd> \anchor _todo000608 (user): A MIP solver will potentially store a lot of BasisStates so
memory usage is important. It is possible to use only 2 bits for one
VariableStatus enum. To achieve this, the FIXED_VALUE status can be
converted to either AT_LOWER_BOUND or AT_UPPER_BOUND and decoded properly
later since this will be used with a given linear program. This way we can
even encode more information by using the reduced cost sign to choose to
which bound the fixed status correspond.
</dd> <dt>
\_setscope operations_research::glop::ColumnView Member \_internalref classoperations__research_1_1glop_1_1ColumnView#a37aadf4689cf83d4e92724df18788c26 "operations_research::glop::ColumnView::LookUpCoefficient" (RowIndex index) const</dt><dd> \anchor _todo000869 (user): investigate whether an optimized version of
LookUpCoefficient for "clean" columns yields speed-ups.
</dd> <dt>
\_setscope operations_research::glop::CompactSparseMatrix Member \_internalref classoperations__research_1_1glop_1_1CompactSparseMatrix#aa5613aefbe167b3a7060c47adbc18257 "operations_research::glop::CompactSparseMatrix::CompactSparseMatrix" (const SparseMatrix &matrix)</dt><dd> \anchor _todo000864 (user): If this is needed in production code, it can be done faster.
</dd> <dt>
\_setscope operations_research::glop::DataWrapper< MPModelProto > Member \_internalref classoperations__research_1_1glop_1_1DataWrapper_3_01MPModelProto_01_4#ae847ea2baa71fe069259a785a2f793ba "operations_research::glop::DataWrapper< MPModelProto >::CleanUp" ()</dt><dd> \anchor _todo000845 (user): Experiment with the switch constant.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#a02a36a3bb1bee8ca88e9d07f4e914ad2 "operations_research::glop::Density" (const DenseRow &row)</dt><dd> \anchor _todo000840 (user): Take a Scattered row/col instead. This is only used to report
stats, but we should still have a sparse version to do it faster.
</dd> <dt>
\_setscope operations_research::glop::DoubletonEqualityRowPreprocessor Member \_internalref classoperations__research_1_1glop_1_1DoubletonEqualityRowPreprocessor#a417519507dabcad60034e4b158755bf5 "operations_research::glop::DoubletonEqualityRowPreprocessor::RecoverSolution" (ProblemSolution *solution) const final</dt><dd> \anchor _todo000502 (user): We can probably use something better than a vector of set,
but the number of entry is really sparse though. And the size of a set<int>
is 24 bytes, same as a std::vector<int>.
</dd> <dt>
\_setscope operations_research::glop::DoubletonEqualityRowPreprocessor Member \_internalref classoperations__research_1_1glop_1_1DoubletonEqualityRowPreprocessor#aee8ab3fb7503d6267c9a09854ecd7a2d "operations_research::glop::DoubletonEqualityRowPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000497 (user): Get rid of the FIXED status instead to avoid spending
time/memory for no good reason here.
<p> \anchor _todo000498 (user): There is probably some more robust ways.
<p> \anchor _todo000499 (user): make a smarter choice of which column to delete, and
swap col[] and coeff[] accordingly.
<p> \anchor _todo000500 (user): consider skipping the problematic rows in this preprocessor,
or trying harder to avoid the under/overflow.
<p> \anchor _todo000501 (user): rename that method to reflect the fact that it also updates
the objective offset, in the other direction.
</dd> <dt>
\_setscope operations_research::glop::DoubletonFreeColumnPreprocessor Member \_internalref classoperations__research_1_1glop_1_1DoubletonFreeColumnPreprocessor#ab64cfa1fb6ff03f45291fcb60f506963 "operations_research::glop::DoubletonFreeColumnPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000481 (user): Impact?
</dd> <dt>
\_setscope operations_research::glop::DualEdgeNorms Member \_internalref classoperations__research_1_1glop_1_1DualEdgeNorms#ab9c06f7b3b7e0337da531ca86c3fd43c "operations_research::glop::DualEdgeNorms::UpdateBeforeBasisPivot" (ColIndex entering_col, RowIndex leaving_row, const ScatteredColumn &direction, const ScatteredRow &unit_row_left_inverse)</dt><dd> \anchor _todo000429 (user): use a more precise lower bound depending on the column norm?
We can do that with Cauchy-Swartz inequality:
(edge . leaving_column)^2 = 1.0 < |<tt>edge</tt>|^2 * |<tt>leaving_column</tt>|^2
</dd> <dt>
\_setscope operations_research::glop::DualizerPreprocessor Member \_internalref classoperations__research_1_1glop_1_1DualizerPreprocessor#afb190878213f1da31a0daa0f03b9e017 "operations_research::glop::DualizerPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000503 (user): This effect can be lowered if we use some of the extra
variables as slack variable which we are not doing at this point.
<p> \anchor _todo000504 (user): This will break if PopulateFromDual() is changed. so document
the convention or make the function fill these vectors?
<p> \anchor _todo000505 (user): There are two different ways to deal with ranged rows when
taking the dual. The default way is to duplicate such rows, see
PopulateFromDual() for details. Another way is to call
lp->AddSlackVariablesForFreeAndBoxedRows() before calling
PopulateFromDual(). Adds an option to switch between the two as this may
change the running time?</dd> <dt>
\_setscope operations_research::glop::DynamicMaximum Member \_internalref classoperations__research_1_1glop_1_1DynamicMaximum#a5a1cf0bc9507c1dfcef22b8d89d2d9f0 "operations_research::glop::DynamicMaximum< Index >::GetMaximum" ()</dt><dd> \anchor _todo000520 (user): Add a mode when we do not maintain the TopK for small sizes
(like n < 1000) ? The gain might not be worth the extra code though.
</dd> <dt>
\_setscope operations_research::glop::EnteringVariable Member \_internalref classoperations__research_1_1glop_1_1EnteringVariable#a3c3a0b006ecdc59714cd1c66f50e7cff "operations_research::glop::EnteringVariable::DeterministicTime" () const</dt><dd> \anchor _todo000433 (user): Be exhausitive and more precise.
</dd> <dt>
\_setscope operations_research::glop::EnteringVariable Member \_internalref classoperations__research_1_1glop_1_1EnteringVariable#a863b59030d198656afffb23fcd533948 "operations_research::glop::EnteringVariable::DualChooseEnteringColumn" (bool nothing_to_recompute, const UpdateRow &update_row, Fractional cost_variation, std::vector< ColIndex > *bound_flip_candidates, ColIndex *entering_col)</dt><dd> \anchor _todo000431 (user): We want to maximize both the ratio (objective improvement)
and the coeff_magnitude (stable pivot), so we have to make some
trade-offs. Investigate alternative strategies.
<p> \anchor _todo000430 (user): It is unclear if this is a good idea, but the primal simplex
have pretty good/stable behavior with a similar logic. Experiment seems
to show that this works well with the dual too.
</dd> <dt>
\_setscope operations_research::glop::EnteringVariable Member \_internalref classoperations__research_1_1glop_1_1EnteringVariable#ad20764201d083354bdf18a8def790e4a "operations_research::glop::EnteringVariable::DualPhaseIChooseEnteringColumn" (bool nothing_to_recompute, const UpdateRow &update_row, Fractional cost_variation, ColIndex *entering_col)</dt><dd> \anchor _todo000432 (user): This is the same in DualChooseEnteringColumn(), remove
duplication?
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#aed75af61dbbe6d3c628c274f271f9000 "operations_research::glop::FindProportionalColumns" (const SparseMatrix &matrix, Fractional tolerance)</dt><dd> \anchor _todo000842 (user): Derive precise bounds on what this tolerance should be so
that no proportional columns are missed.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#ac55fddbd6cdae02b8a88e2c845f0d4d7 "operations_research::glop::FixConstraintWithFixedStatuses" (const DenseColumn &row_lower_bounds, const DenseColumn &row_upper_bounds, ProblemSolution *solution)</dt><dd> \anchor _todo000511 (user): A better solution would simply be to get rid of the FIXED status
altogether, it is better to simply use AT_LOWER_BOUND/AT_UPPER_BOUND
depending on the constraining bound in the optimal solution. Note that we can
always at the end transform any variable/constraint with a fixed domain to
FIXED_VALUE if needed to keep the same external API.
</dd> <dt>
\_setscope operations_research::glop::ImpliedFreePreprocessor Class \_internalref classoperations__research_1_1glop_1_1ImpliedFreePreprocessor "operations_research::glop::ImpliedFreePreprocessor" </dt><dd> \anchor _todo000510 (user): Only process doubleton columns so we have more chance in the
later passes to create more doubleton columns? Such columns lead to a smaller
problem thanks to the DoubletonFreeColumnPreprocessor.
</dd> <dt>
\_setscope operations_research::glop::ImpliedFreePreprocessor Member \_internalref classoperations__research_1_1glop_1_1ImpliedFreePreprocessor#a22a4d717e6ac86260356defc467e980e "operations_research::glop::ImpliedFreePreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000477 (user): Only process degree-two so in subsequent passes more degree-two
columns could be made free. And only when no other reduction can be
applied, process the higher degree column?<p> \anchor _todo000478 (user): Be smarter about the order that maximizes the number of free
column. For instance if we have 3 doubleton columns that use the rows (1,2)
(2,3) and (3,4) then it is better not to make (2,3) free so the two other
two can be made free.
<p> \anchor _todo000476 (user) : Replace SumWithNegativeInfiniteAndOneMissing and
SumWithPositiveInfiniteAndOneMissing with IntervalSumWithOneMissing.
<p> \anchor _todo000479 (user): As of July 2013, with our preprocessors this case is never
triggered on the Netlib. Note however that if it appears it can have a
big impact since by fixing the variable, the two involved constraints
are forcing and can be removed too (with all the variables they touch).
The postsolve step is quite involved though.
<p> \anchor _todo000480 (user): This trick is already used in the DualizerPreprocessor,
maybe we should just have a preprocessor that shifts all the variables
bounds to have at least one of them at 0.0, will that improve precision
and speed of the simplex? One advantage is that we can compute the
new constraint bounds with better precision using AccurateSum.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#a451faba66f544c02438a3ce062b69900 "operations_research::glop::KahanSum" </dt><dd> \anchor _todo000838 (user): For some Fractional types, it may not gain much (or even nothing
if we are in infinite precision) to use this sum. A solution is to templatize
this class and specialize it to a normal sum for the Fractional type we want
so in this case the PreciseXXX() functions below will become equivalent to
their normal version.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#abbaca14cc7f5a0f3aaeb027fef37e0ca "operations_research::glop::kNonPivotal" (-1)</dt><dd> \anchor _todo000868 (user): Consider using kInvalidRow for this?
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#a65b22be15b4caa784b8d7c690e2418ae "operations_research::glop::LinearProgram::AddSlackVariablesWhereNecessary" (bool detect_integer_constraints)</dt><dd> \anchor _todo000833 (user): investigate the impact on the running time. It seems low
because we almost never iterate on fixed variables.
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#ab7e81c6d3e23deb4d58662661bf07f70 "operations_research::glop::LinearProgram::Dump" () const</dt><dd> \anchor _todo000828 (user): if needed provide similar output for binary variables.
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#a8eb71b2feea025093caf9ee0ecaa1bc5 "operations_research::glop::LinearProgram::FindOrCreateVariable" (absl::string_view variable_id)</dt><dd> \anchor _todo000830 (user): Move these and the two corresponding hash_table into a new
LinearProgramBuilder class to simplify the code of some functions like
DeleteColumns() here and make the behavior on copy clear? or simply remove
them as it is almost as easy to maintain a hash_table on the client side.
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#abdf54cae5dbc76354d86e34108dcb3f3 "operations_research::glop::LinearProgram::GetNonZeroStats" () const</dt><dd> \anchor _todo000832 (user): Theses are statistics about the underlying matrix and should be
moved to SparseMatrix.
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#a8c6c53f53e930c90d42930e648946ec6 "operations_research::glop::LinearProgram::IsVariableBinary" (ColIndex col) const</dt><dd> \anchor _todo000827 (user): bounds of binary variables (and of integer ones) should
be integer. Add a preprocessor for that.
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#afdef8d3fad551379c138ea96f9b695d3 "operations_research::glop::LinearProgram::PopulateFromDual" (const LinearProgram &dual, RowToColMapping *duplicated_rows)</dt><dd> \anchor _todo000834 (user): Do not interpret as a minimization problem?
</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#a8c83436c29274ad2930e716a0032d708 "operations_research::glop::LinearProgram::ScaleObjective" (GlopParameters::CostScalingAlgorithm method)</dt><dd> \anchor _todo000835 (user): Another more aggressive idea is to set the median/mean/geomean
of the magnitudes to one. Investigate if this leads to better results. It
does look more robust.</dd> <dt>
\_setscope operations_research::glop::LinearProgram Member \_internalref classoperations__research_1_1glop_1_1LinearProgram#aafd3e53a18570f0757a0a58f666b88c8 "operations_research::glop::LinearProgram::SetVariableName" (ColIndex col, absl::string_view name)</dt><dd> \anchor _todo000831 (user): Add PopulateIdsFromNames() so names added via
Set{Variable|Constraint}Name() can be found.
</dd> <dt>
\_setscope operations_research::glop::LPSolver Member \_internalref classoperations__research_1_1glop_1_1LPSolver#a9546370ee7138da64e3fb67577230bad "operations_research::glop::LPSolver::DeterministicTime" () const</dt><dd> \anchor _todo000451 (user): Currently, this is only modified when the simplex code is
executed.<p> \anchor _todo000452 (user): Improve the correlation with the running time.
</dd> <dt>
\_setscope operations_research::glop::LPSolver Member \_internalref classoperations__research_1_1glop_1_1LPSolver#ae525d5598b932514635be5f0329610a4 "operations_research::glop::LPSolver::LoadAndVerifySolution" (const LinearProgram &lp, const ProblemSolution &solution)</dt><dd> \anchor _todo000438 (user): Try to also check the precision of an INFEASIBLE or UNBOUNDED
return status.
<p> \anchor _todo000439 (user): the name is not really consistent since in practice those are
the "residual" since the primal/dual infeasibility are zero when
parameters_.provide_strong_optimal_guarantee() is true.
</dd> <dt>
\_setscope operations_research::glop::LPSolver Member \_internalref classoperations__research_1_1glop_1_1LPSolver#adb7f0e515ab9d9503a454e05904c0376 "operations_research::glop::LPSolver::MayHaveMultipleOptimalSolutions" () const</dt><dd> \anchor _todo000450 (user): Test this behavior extensively if a client relies on it.
</dd> <dt>
\_setscope operations_research::glop::LPSolver Member \_internalref classoperations__research_1_1glop_1_1LPSolver#ac1d303dc79dae9cefd6185fda6c60e33 "operations_research::glop::LPSolver::SolveWithTimeLimit" (const LinearProgram &lp, TimeLimit *time_limit)</dt><dd> \anchor _todo000436 (user): Unfortunately we are not really helpful with the error message
here. We could do a better job. However most client should talk to glop via
an input protocol buffer which should have better validation messages.
<p> \anchor _todo000437 (user): If speed matter, we could do that as we copy the program.
</dd> <dt>
\_setscope operations_research::glop::LuFactorization Member \_internalref classoperations__research_1_1glop_1_1LuFactorization#ab7b32a56a250336b4f954ad707f24b90 "operations_research::glop::LuFactorization::ComputeLowerTimesUpper" (SparseMatrix *product) const</dt><dd> \anchor _todo000455 (user): avoid the matrix conversion by multiplying TriangularMatrix
directly.
</dd> <dt>
\_setscope operations_research::glop::LuFactorization Member \_internalref classoperations__research_1_1glop_1_1LuFactorization#a9af5d602c804b0b6b64ace6d1b61f169 "operations_research::glop::LuFactorization::ComputeOneNormConditionNumber" (const CompactSparseMatrixView &matrix) const</dt><dd> \anchor _todo000454 (user): separate this from LuFactorization.
</dd> <dt>
\_setscope operations_research::glop::MainLpPreprocessor Member \_internalref classoperations__research_1_1glop_1_1MainLpPreprocessor#a2d3237c0758f6628b102fcbe5b2002c8 "operations_research::glop::MainLpPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000470 (user): Run them in the loop above if the effect on the running time
is good. This needs more investigation.
<p> \anchor _todo000471 (user): We probably want to scale the costs before and after this
preprocessor so that the rhs/objective of the dual are with a good
magnitude.
</dd> <dt>
\_setscope operations_research::glop::Markowitz Member \_internalref classoperations__research_1_1glop_1_1Markowitz#a57adb2bec33795ce391f871a1acbf761 "operations_research::glop::Markowitz::ComputeRowAndColumnPermutation" (const CompactSparseMatrixView &basis_matrix, RowPermutation *row_perm, ColumnPermutation *col_perm)</dt><dd> \anchor _todo000456 (user): If we don't need L and U, we can abort when the residual
matrix becomes dense (i.e. when its density factor is above a certain
threshold). The residual size is 'end_index - index' and the
density can either be computed exactly or estimated from min_markowitz.
<p> \anchor _todo000457 (user): This step can be skipped, once a fully dense matrix is
obtained. But note that permuted_lower_column_needs_solve_ needs to be
updated.
<p> \anchor _todo000458 (user): Note that in some rare cases, because of numerical
cancellation, the column degree may actually be smaller than
pivot_col_degree. Exploit that better?
</dd> <dt>
\_setscope operations_research::glop::MatrixEntry Struct \_internalref structoperations__research_1_1glop_1_1MatrixEntry "operations_research::glop::MatrixEntry" </dt><dd> \anchor _todo000509 (user): Generalize the design used in this preprocessor to a general
"propagation" framework in order to apply as many reductions as possible in
an efficient manner.
</dd> <dt>
\_setscope operations_research::glop::MatrixNonZeroPattern Member \_internalref classoperations__research_1_1glop_1_1MatrixNonZeroPattern#acba2eb03de47fb8c7cabe51848d04612 "operations_research::glop::MatrixNonZeroPattern::Update" (RowIndex pivot_row, ColIndex pivot_col, const SparseColumn &column)</dt><dd> \anchor _todo000465 (user): Special case if row_non_zero_[pivot_row].size() == 1?
<p> \anchor _todo000466 (user): Add unit tests before using this.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#af8a64136c69a6dfc1b38c22c754cbe65 "operations_research::glop::MPModelProtoToLinearProgram" (const MPModelProto &input, LinearProgram *output)</dt><dd> \anchor _todo000856 (user): implement strong proto validation in the
linear solver server and re-use it here.
<p> \anchor _todo000855 (user): clean up loops to use natural range iteration.
</dd> <dt>
\_setscope operations_research::glop::Preprocessor Class \_internalref classoperations__research_1_1glop_1_1Preprocessor "operations_research::glop::Preprocessor" </dt><dd> \anchor _todo000508 (user): On most preprocessors, calling Run() more than once will not work
as expected. Fix? or document and crash in debug if this happens.
</dd> <dt>
\_setscope operations_research::glop::Preprocessor Member \_internalref classoperations__research_1_1glop_1_1Preprocessor#ab755069ed133ea14ffec0bba56930559 "operations_research::glop::Preprocessor::IsSmallerWithinPreprocessorZeroTolerance" (Fractional a, Fractional b) const</dt><dd> \anchor _todo000514 (user): use an absolute tolerance here to be even more defensive?
</dd> <dt>
\_setscope operations_research::glop::PrimalPrices Class \_internalref classoperations__research_1_1glop_1_1PrimalPrices "operations_research::glop::PrimalPrices" </dt><dd> \anchor _todo000532 (user): Not high priority but should probably be moved to its own file.
</dd> <dt>
\_setscope operations_research::glop::PrimalPrices Member \_internalref classoperations__research_1_1glop_1_1PrimalPrices#ab2a479cbb008b8ae4b9ec2d294f79c07 "operations_research::glop::PrimalPrices::PrimalPrices" (absl::BitGenRef random, const VariablesInfo &variables_info, PrimalEdgeNorms *primal_edge_norms, ReducedCosts *reduced_costs)</dt><dd> \anchor _todo000534 (user): Switch to a model based API like in CP-SAT.
</dd> <dt>
\_setscope operations_research::glop::ProportionalColumnPreprocessor Member \_internalref classoperations__research_1_1glop_1_1ProportionalColumnPreprocessor#afdfcacb0413c8aefe02ff1b9eae0ac68 "operations_research::glop::ProportionalColumnPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000473 (user): Change FindProportionalColumns for this?
</dd> <dt>
\_setscope operations_research::glop::ProportionalRowPreprocessor Member \_internalref classoperations__research_1_1glop_1_1ProportionalRowPreprocessor#adddaa59a5bbb8b300795e6f2b9287d3c "operations_research::glop::ProportionalRowPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000474 (user): Already return such a mapping from
FindProportionalColumns()?
<p> \anchor _todo000475 (user): if the bounds are equal, use the largest row in magnitude?
</dd> <dt>
\_setscope operations_research::glop::RandomAccessSparseColumn Member \_internalref classoperations__research_1_1glop_1_1RandomAccessSparseColumn#a59461735207f0d09b1175d3522762f2a "operations_research::glop::RandomAccessSparseColumn::PopulateSparseColumn" (SparseColumn *sparse_column) const</dt><dd> \anchor _todo000867 (user): Do that only if (value != 0.0) ?
</dd> <dt>
\_setscope operations_research::glop::RankOneUpdateFactorization Member \_internalref classoperations__research_1_1glop_1_1RankOneUpdateFactorization#a3b877b20ffaa0ba743da5c3cb7fa7744 "operations_research::glop::RankOneUpdateFactorization::DeterministicTimeSinceLastReset" () const</dt><dd> \anchor _todo000529 (user): This is quite precise. However we overcount a bit, because in
each elementary solves, if the scalar product involved is zero, we skip
some of the operations counted here. Is it worth spending a bit more time
to be more precise here?
</dd> <dt>
\_setscope operations_research::glop::RankOneUpdateFactorization Member \_internalref classoperations__research_1_1glop_1_1RankOneUpdateFactorization#af68318310cfb9859c6d98a3e31ccafac "operations_research::glop::RankOneUpdateFactorization::RankOneUpdateFactorization" ()</dt><dd> \anchor _todo000528 (user): make the 5% a parameter and share it between all the places
that switch between a sparse/dense version.
</dd> <dt>
\_setscope operations_research::glop::RevisedSimplex Member \_internalref classoperations__research_1_1glop_1_1RevisedSimplex#ac81a24729018987c4d0668b7dc92b7c7 "operations_research::glop::RevisedSimplex::ComputeDictionary" (const DenseRow *column_scales)</dt><dd> \anchor _todo000589 (user): Use row scales as well.
</dd> <dt>
\_setscope operations_research::glop::RevisedSimplex Member \_internalref classoperations__research_1_1glop_1_1RevisedSimplex#ada2f59f7b385068f27d172f1f9bff72a "operations_research::glop::RevisedSimplex::DeterministicTime" () const</dt><dd> \anchor _todo000544 (user): Count what is missing.
</dd> <dt>
\_setscope operations_research::glop::RevisedSimplex Member \_internalref classoperations__research_1_1glop_1_1RevisedSimplex#ac08f8edb988e06b034fa6f9516913368 "operations_research::glop::RevisedSimplex::Solve" (const LinearProgram &lp, TimeLimit *time_limit)</dt><dd> \anchor _todo000543 (user): We should re-check for feasibility at this point and
apply clean-up as needed.
<p> \anchor _todo000542 (user): we currently skip the DUAL_INFEASIBLE status because the
quantities are not up to date in this case.
<p> \anchor _todo000541 (user): There is another issue on infeas/qual.mps. I think we should
just check the dual ray, not really the current solution dual
feasibility.
<p> \anchor _todo000540 (user): We should also confirm the PRIMAL_UNBOUNDED or DUAL_UNBOUNDED
status by checking with the other phase I that the problem is really
DUAL_INFEASIBLE or PRIMAL_INFEASIBLE. For instance we currently report
PRIMAL_UNBOUNDED with the primal on the problem l30.mps instead of
OPTIMAL and the dual does not have issues on this problem.<p> \anchor _todo000539 (user): What if slightly infeasible? we shouldn't really stop.
Call primal ? use higher tolerance ? It seems we can always kind of
continue and deal with the issue later. Find a way other than this +
1e-6 hack.
<p> \anchor _todo000538 (user): Note that if there was cost shifts, we just keep them
until the end of the optim.<p> \anchor _todo000537 (user): Not ideal in an incremental setting.
<p> \anchor _todo000536 (user): Avoid doing the first phase checks when we know from the
incremental solve that the solution is already dual or primal feasible.
</dd> <dt>
\_setscope operations_research::glop::RevisedSimplexDictionary Member \_internalref classoperations__research_1_1glop_1_1RevisedSimplexDictionary#a23359894a725f27972fc3a3b6b919db9 "operations_research::glop::RevisedSimplexDictionary::GetBasicColumnForRow" (RowIndex r) const</dt><dd> \anchor _todo000593 (user): This function is a better fit for the future custom iterator.
</dd> <dt>
\_setscope operations_research::glop::RevisedSimplexDictionary Member \_internalref classoperations__research_1_1glop_1_1RevisedSimplexDictionary#a79cca8bd83c2bde1691dd782335d767e "operations_research::glop::RevisedSimplexDictionary::RevisedSimplexDictionary" (const DenseRow *col_scales, RevisedSimplex *revised_simplex)</dt><dd> \anchor _todo000592 (user): Overload this to take RevisedSimplex* alone when the
caller would normally pass a nullptr for col_scales so this and
ComputeDictionary can take a const& argument.
</dd> <dt>
\_setscope operations_research::glop Member \_internalref namespaceoperations__research_1_1glop#a46935a48ea28abfec1c2569fe4aea70f "operations_research::glop::ScalarProduct" (const DenseRowOrColumn &u, const SparseColumn &v)</dt><dd> \anchor _todo000839 (user): Optimize this more (SSE or unroll with two sums). Another
option is to skip the u[col] that are 0.0 rather than fetching the coeff
and doing a Fractional multiplication.
</dd> <dt>
\_setscope operations_research::glop::ScatteredVector Struct \_internalref structoperations__research_1_1glop_1_1ScatteredVector "operations_research::glop::ScatteredVector< Index, Iterator >" </dt><dd> \anchor _todo000857 (user): This should be changed from struct to class.
</dd> <dt>
\_setscope operations_research::glop::ScatteredVector Member \_internalref structoperations__research_1_1glop_1_1ScatteredVector#a1863a881c8165a5b4217f58e70dcbc97 "operations_research::glop::ScatteredVector< Index, Iterator >::kDefaultRatioForUsingDenseIteration" </dt><dd> \anchor _todo000858 (user): The constant should depend on what algorithm is used. Clearing
a dense vector is a lot more efficient than doing more complex stuff. Clean
this up by extracting all the currently used constants in one place with
meaningful names.
</dd> <dt>
\_setscope operations_research::glop::ShiftVariableBoundsPreprocessor Class \_internalref classoperations__research_1_1glop_1_1ShiftVariableBoundsPreprocessor "operations_research::glop::ShiftVariableBoundsPreprocessor" </dt><dd> \anchor _todo000512 (user): Having for each variable one of their bounds at zero is a
requirement for the DualizerPreprocessor and for the implied free column in
the ImpliedFreePreprocessor. However, shifting a variable with a domain like
[-1e10, 1e10] may introduce numerical issues. Relax the definition of
a free variable so that only having a domain containing 0.0 is enough?
</dd> <dt>
\_setscope operations_research::glop::ShiftVariableBoundsPreprocessor Member \_internalref classoperations__research_1_1glop_1_1ShiftVariableBoundsPreprocessor#aaa5aa6fd0a5ab4229ab8b8f1ca6f638c "operations_research::glop::ShiftVariableBoundsPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000506 (user): This would not be needed, if we always make the bound
of an integer variable integer before applying this preprocessor.
</dd> <dt>
\_setscope operations_research::glop::SingletonPreprocessor Member \_internalref classoperations__research_1_1glop_1_1SingletonPreprocessor#ad57922a716f7058c76b5f524950b8953 "operations_research::glop::SingletonPreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000495 (user): It seems better to process all the singleton columns with
a cost of zero first.
<p> \anchor _todo000496 (user): We should be able to restrict the variable bounds with the
ones of the constraint all the time. However, some situation currently
break the presolve, and it seems hard to fix in a 100% safe way.
</dd> <dt>
\_setscope operations_research::glop::SparseMatrixScaler Member \_internalref classoperations__research_1_1glop_1_1SparseMatrixScaler#abe05dd74a745d50bce6f9b6f14ab0bbc "operations_research::glop::SparseMatrixScaler::Scale" (GlopParameters::ScalingAlgorithm method)</dt><dd> \anchor _todo000841 (user): Decide precisely for which value of dynamic range we should cut
off geometric scaling.
</dd> <dt>
\_setscope operations_research::glop::SparseRow Class \_internalref classoperations__research_1_1glop_1_1SparseRow "operations_research::glop::SparseRow" </dt><dd> \anchor _todo000870 (user): Use this class where appropriate, i.e. when a SparseColumn is
used to store a row vector (by means of RowIndex to ColIndex casting).
</dd> <dt>
\_setscope operations_research::glop::SparseVector Class \_internalref classoperations__research_1_1glop_1_1SparseVector "operations_research::glop::SparseVector< IndexType, IteratorType >" </dt><dd> \anchor _todo000871 (user): un-expose this type to client; by getting rid of the
index-based APIs and leveraging iterator-based APIs; if possible.
</dd> <dt>
\_setscope operations_research::glop::SparseVector Member \_internalref classoperations__research_1_1glop_1_1SparseVector#a281b1ceefbefc14e321958f139dd8ea3 "operations_research::glop::SparseVector< IndexType, IteratorType >::AllEntryIndices" () const</dt><dd> \anchor _todo000876 (user): consider removing this, in favor of the natural range
iteration.
</dd> <dt>
\_setscope operations_research::glop::SparseVector Member \_internalref classoperations__research_1_1glop_1_1SparseVector#afb0952c189b9c921d79526b96295a2c8 "operations_research::glop::SparseVector< IndexType, IteratorType >::CleanUp" ()</dt><dd> \anchor _todo000872 (user): Implement in-place sorting of the entries and cleanup. The
current version converts the data to an array-of-pairs representation that
can be sorted easily with std::stable_sort, and the converts the sorted
data back to the struct-of-arrays implementation.
The current version is ~20% slower than the in-place sort on the
array-of-struct representation. It is not visible on GLOP benchmarks, but
it increases peak memory usage by ~8%.
Implementing in-place search will require either implementing a custom
sorting code, or custom iterators that abstract away the internal
representation.
</dd> <dt>
\_setscope operations_research::glop::SparseVector Member \_internalref classoperations__research_1_1glop_1_1SparseVector#afbae873b1b6a1f33cac11606834b6d0e "operations_research::glop::SparseVector< IndexType, IteratorType >::LookUpCoefficient" (Index index) const</dt><dd> \anchor _todo000875 (user): investigate whether an optimized version of
LookUpCoefficient for "clean" columns yields speed-ups.
</dd> <dt>
\_setscope operations_research::glop::SparseVector Member \_internalref classoperations__research_1_1glop_1_1SparseVector#ac8066cbc5d5b7f8e794677b027cd96a2 "operations_research::glop::SparseVector< IndexType, IteratorType >::MoveTaggedEntriesTo" (const IndexPermutation &index_perm, SparseVector *output)</dt><dd> \anchor _todo000874 (user): In the way we use this function, we know that will not
happen, but it is better to be careful so we can check that properly in
debug mode.
</dd> <dt>
\_setscope operations_research::glop::StrictITISpan Member \_internalref classoperations__research_1_1glop_1_1StrictITISpan#a567f91a908d6143535f19afba8b2066b "operations_research::glop::StrictITISpan< IntType, T >::begin" () const</dt><dd> \anchor _todo000837 (user): This should probably be a strictly typed iterator too, but
<tt>StrongVector::begin()</tt> already suffers from this problem.
</dd> <dt>
\_setscope operations_research::glop::StrictITIVector Class \_internalref classoperations__research_1_1glop_1_1StrictITIVector "operations_research::glop::StrictITIVector< IntType, T >" </dt><dd> \anchor _todo000836 (user): This should probably move into ITIVector, but note that this
version is more strict and does not allow any other size types.
</dd> <dt>
\_setscope operations_research::glop::TriangularMatrix Member \_internalref classoperations__research_1_1glop_1_1TriangularMatrix#ad5f38322fa7495d265b8a9d165e04661 "operations_research::glop::TriangularMatrix::AddAndNormalizeTriangularColumn" (const SparseColumn &column, RowIndex diagonal_row, Fractional diagonal_coefficient)</dt><dd> \anchor _todo000860 (user): use division by a constant using multiplication.
</dd> <dt>
\_setscope operations_research::glop::TriangularMatrix Member \_internalref classoperations__research_1_1glop_1_1TriangularMatrix#a73b763db84bea0b037a221f4f0a8b341 "operations_research::glop::TriangularMatrix::ComputeRowsToConsiderInSortedOrder" (RowIndexVector *non_zero_rows) const</dt><dd> \anchor _todo000863 (user): Investigate the best thresholds.
</dd> <dt>
\_setscope operations_research::glop::TriangularMatrix Member \_internalref classoperations__research_1_1glop_1_1TriangularMatrix#adbf1ad02396e91500821d368dcd2ed4a "operations_research::glop::TriangularMatrix::ComputeRowsToConsiderWithDfs" (RowIndexVector *non_zero_rows) const</dt><dd> \anchor _todo000862 (user): Investigate the best thresholds.
</dd> <dt>
\_setscope operations_research::glop::TriangularMatrix Member \_internalref classoperations__research_1_1glop_1_1TriangularMatrix#accd27fcf09dbc70b99c5ff3420df68ab "operations_research::glop::TriangularMatrix::PermutedLowerSparseSolve" (const ColumnView &rhs, const RowPermutation &row_perm, SparseColumn *lower, SparseColumn *upper)</dt><dd> \anchor _todo000861 (user): The size of lower is exact, so we could be slighly faster here.
</dd> <dt>
\_setscope operations_research::glop::UnconstrainedVariablePreprocessor Member \_internalref classoperations__research_1_1glop_1_1UnconstrainedVariablePreprocessor#a85bc81777e98efdcf8e96566dc7b34b5 "operations_research::glop::UnconstrainedVariablePreprocessor::RecoverSolution" (ProblemSolution *solution) const final</dt><dd> \anchor _todo000488 (user): In presence of free row, we must move them to 0.
</dd> <dt>
\_setscope operations_research::glop::UnconstrainedVariablePreprocessor Member \_internalref classoperations__research_1_1glop_1_1UnconstrainedVariablePreprocessor#ab9d32efc837e15a7512083c4e450d459 "operations_research::glop::UnconstrainedVariablePreprocessor::RemoveZeroCostUnconstrainedVariable" (ColIndex col, Fractional target_bound, LinearProgram *lp)</dt><dd> \anchor _todo000482 (user): Here, we may render the row free, so subsequent columns
processed by the columns loop in Run() have more chance to be removed.
However, we need to be more careful during the postsolve() if we do that.
</dd> <dt>
\_setscope operations_research::glop::UnconstrainedVariablePreprocessor Member \_internalref classoperations__research_1_1glop_1_1UnconstrainedVariablePreprocessor#a59fa9c1508a94256ea5cb1d79597d170 "operations_research::glop::UnconstrainedVariablePreprocessor::Run" (LinearProgram *lp) final</dt><dd> \anchor _todo000487 (user): It should probably
work with only small modification, investigate.
<p> \anchor _todo000486 (user): this also works if the variable is integer, but we must
choose an integer value during the post-solve. Implement this.
<p> \anchor _todo000485 (user): deal with the more generic case.
<p> \anchor _todo000484 (user): expose this as a parameter? IMO it isn't really needed as we
shouldn't reach this limit except in corner cases.
<p> \anchor _todo000483 (user): Expose it as a parameter. We could rename both to
preprocessor_low_tolerance and preprocessor_high_tolerance.
</dd> <dt>
\_setscope operations_research::glop::UpdateRow Member \_internalref classoperations__research_1_1glop_1_1UpdateRow#a83458aab35755e7f4e0f1a2b38c912c2 "operations_research::glop::UpdateRow::ComputeUnitRowLeftInverse" (RowIndex leaving_row)</dt><dd> \anchor _todo000594 (user): Refactorize if the estimated accuracy is above a threshold.
</dd> <dt>
\_setscope operations_research::glop::UpdateRow Member \_internalref classoperations__research_1_1glop_1_1UpdateRow#a87bff95c808ef1850684ba48f3bf044f "operations_research::glop::UpdateRow::ComputeUpdateRow" (RowIndex leaving_row)</dt><dd> \anchor _todo000597 (user): automate the computation of these constants at run-time?
<p> \anchor _todo000596 (user): The impact is not as high as I hopped though, so not too
important.
<p> \anchor _todo000595 (user): So far we didn't generalize the use of drop tolerances
everywhere in the solver, so we make sure to not modify
unit_row_left_inverse_ that is also used elsewhere. However, because of
that, we will not get the exact same result depending on the algortihm
used below because the ComputeUpdatesColumnWise() will still use these
small entries (no complexity changes).
</dd> <dt>
\_setscope operations_research::glop::UpdateRow Member \_internalref classoperations__research_1_1glop_1_1UpdateRow#a0574601e3d61bdd8bafbd8996c78516b "operations_research::glop::UpdateRow::GetCoefficients" () const</dt><dd> \anchor _todo000599 (user): Consider returning a packed vector of coefficient parallel to
GetNonZeroPositions() instead. It should be fast to compute and iteration
later should be quicker.
</dd> <dt>
\_setscope operations_research::glop::VariablesInfo Member \_internalref classoperations__research_1_1glop_1_1VariablesInfo#ad86973493f57542e9a1e926b2e1f5198 "operations_research::glop::VariablesInfo::EndDualPhaseI" (Fractional dual_feasibility_tolerance, DenseRow::ConstView reduced_costs)</dt><dd> \anchor _todo000606 (user): When there is a choice, use the previous status that might
have been warm-started ? but then this is not high priority since
warm-starting with a non-dual feasible basis seems unfrequent.
</dd> <dt>
\_setscope operations_research::glop::VariablesInfo Member \_internalref classoperations__research_1_1glop_1_1VariablesInfo#a2b7789e59bf13941d89cc6accd874fe1 "operations_research::glop::VariablesInfo::TransformToDualPhaseIProblem" (Fractional dual_feasibility_tolerance, DenseRow::ConstView reduced_costs)</dt><dd> \anchor _todo000609 (user): Shall we re-add the bound when the variable is moved out of
the base? it is not needed, but might allow for more bound flips?
</dd> <dt>
\_setscope operations_research::glop::VariablesInfo Member \_internalref classoperations__research_1_1glop_1_1VariablesInfo#aa6ae2139d9427d7dc458a93e2f8b5588 "operations_research::glop::VariablesInfo::UpdateToBasicStatus" (ColIndex col)</dt><dd> \anchor _todo000602 (user): A bit annoying that we need to test this even if we
don't use the dual. But the cost is minimal.
</dd> <dt>
\_setscope operations_research::glop::VariableValues Member \_internalref classoperations__research_1_1glop_1_1VariableValues#ab0a189867045312e53d3f0c88974e81e "operations_research::glop::VariableValues::RecomputeDualPrices" (bool put_more_importance_on_norm=false)</dt><dd> \anchor _todo000600 (user): On some problem like stp3d.mps or pds-100.mps, using different
price like abs(infeasibility) / squared_norms give better result. Some
solver switch according to a criteria like all entry are +1/-1, the column
have no more than 24 non-zero and the average column size is no more than
6! Understand and implement some variant of this? I think the gain is
mainly because of using sparser vectors?
</dd> <dt>
\_setscope operations_research::GLOPInterface Member \_internalref classoperations__research_1_1GLOPInterface#ac495bd550d8588e457e6998d9af89b53 "operations_research::GLOPInterface::SetDualTolerance" (double value) override</dt><dd> \anchor _todo000749 (user): Modify parameters_ with the correct value.
The problem is that this is set by default by the wrapper to 1e-7 and for
now we want to use higher default tolerances in Glop.
</dd> <dt>
\_setscope operations_research::GLOPInterface Member \_internalref classoperations__research_1_1GLOPInterface#a5e4f4b2a7b1140077d676a179a349dc3 "operations_research::GLOPInterface::SetPrimalTolerance" (double value) override</dt><dd> \anchor _todo000748 (user): Modify parameters_ with the correct value.
The problem is that this is set by default by the wrapper to 1e-7 and for
now we want to use higher default tolerances in Glop.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a1ee695f58f621e16b25ee9e437ac26b2 "operations_research::GlopSolveProto" (MPModelRequest request, std::atomic< bool > *interrupt_solve, std::function< void(const std::string &)> logging_callback)</dt><dd> \anchor _todo000788 (user): We do not support all the parameters here. In particular the
logs before the solver is called will not be appended to the response. Fix
that, and remove code duplication for the logger config. One way should be
to not touch/configure anything if the logger is already created while
calling SolveCpModel() and call a common config function from here or from
inside Solve()?
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a09ec441521b625aa6d45620f6b26d781 "operations_research::GlopToMPSolverResultStatus" (glop::ProblemStatus s)</dt><dd> \anchor _todo000750 (user): We could argue that it is infeasible to find the optimal of
an unbounded problem. So it might just be simpler to completely get rid
of the MpSolver::UNBOUNDED status that seems to never be used
programmatically.
</dd> <dt>
\_setscope operations_research::GLPKInterface Member \_internalref classoperations__research_1_1GLPKInterface#a2a1e883d9de9f8d855a561dea457c8a4 "operations_research::GLPKInterface::ComputeExactConditionNumber" () const override</dt><dd> \anchor _todo000751 (user): support MIP.
</dd> <dt>
\_setscope operations_research::GraphSymmetryFinder Member \_internalref classoperations__research_1_1GraphSymmetryFinder#a42c71ed3bac0344dfe9964839806566b "operations_research::GraphSymmetryFinder::FindSymmetries" (std::vector< int > *node_equivalence_classes_io, std::vector< std::unique_ptr< SparsePermutation > > *generators, std::vector< int > *factorized_automorphism_group_size, TimeLimit *time_limit=nullptr)</dt><dd> \anchor _todo000013 <p> \anchor _todo000014 (user): Don't build a list; but instead use direct, inline iteration
on the representatives in the while() loop below, to benefit from the
incremental merging of the equivalence classes.
<p> \anchor _todo000011 (user): experiment with, and briefly describe the results of various
algorithms for picking the invariant node:
- random selection
- highest/lowest degree first
- enumerate by part index; or by part size
- etc.
<p> \anchor _todo000012 (user): better elect the representative of each equivalence class
in order to reduce the permutation support down the line
<p> \anchor _todo000026 (user): verify the minimality in unit tests.<p> \anchor _todo000015 (user): better, more complete explanation.
</dd> <dt>
\_setscope operations_research::GraphSymmetryFinder Member \_internalref classoperations__research_1_1GraphSymmetryFinder#af670a8f7f325e3a7431f2723c52ec25d "operations_research::GraphSymmetryFinder::GraphSymmetryFinder" (const Graph &graph, bool is_undirected)</dt><dd> \anchor _todo000025 (user): support multi-arcs.
</dd> <dt>
\_setscope operations_research::GraphSymmetryFinder Member \_internalref classoperations__research_1_1GraphSymmetryFinder#a70544105d8f21edcbed63fdd7f6d34ab "operations_research::GraphSymmetryFinder::RecursivelyRefinePartitionByAdjacency" (int first_unrefined_part_index, DynamicPartition *partition)</dt><dd> \anchor _todo000010 (user): We are really imprecise in our counting, but it is fine. We
just need a way to enforce a deterministic limit on the computation effort.
</dd> <dt>
\_setscope operations_research::GreedySolutionGenerator Member \_internalref classoperations__research_1_1GreedySolutionGenerator#ab50373b232711b27f49e7802c206d581 "operations_research::GreedySolutionGenerator::NextSolution" ()</dt><dd> \anchor _todo000047 (user): Add time-outs and exit with a partial solution.
</dd> <dt>
\_setscope operations_research::GreedySolutionGenerator Member \_internalref classoperations__research_1_1GreedySolutionGenerator#a0317564caf6b4d3d860bb635ff02c56e "operations_research::GreedySolutionGenerator::NextSolution" (const std::vector< SubsetIndex > &focus, const SubsetCostVector &costs)</dt><dd> \anchor _todo000041 (user): build in O(N) instead of O(n lg(N)).
</dd> <dt>
\_setscope operations_research::GScip Member \_internalref classoperations__research_1_1GScip#ab7136ff892af60a8dd914f5953f39e9b "operations_research::GScip::SetBranchingPriority" (SCIP_VAR *var, int priority)</dt><dd> \anchor _todo000722 (user): Add support for BranchingFactor as well, this is typically
more useful.
</dd> <dt>
\_setscope operations_research::GScip Member \_internalref classoperations__research_1_1GScip#ab1e8e1eb53b45e5a8199f9085b99e601 "operations_research::GScip::SetLb" (SCIP_VAR *var, double lb)</dt><dd> \anchor _todo000720 (b/246342145): A crash may occur if you attempt to set a lb <= -1.0 on
a binary variable. SCIP can also silently change the vartype of a variable
after construction, so you should check it via <tt>VarType()</tt>.
</dd> <dt>
\_setscope operations_research::GScip Member \_internalref classoperations__research_1_1GScip#afbb8ce39eb848e6f1ad16e1846bab991 "operations_research::GScip::SetLinearConstraintCoef" (SCIP_CONS *constraint, SCIP_VAR *var, double value)</dt><dd> \anchor _todo000718 (user): this operation is slow (linear in the nnz in the constraint).
It would be better to just use a bulk operation, but there doesn't appear
to be any?
</dd> <dt>
\_setscope operations_research::GScip Member \_internalref classoperations__research_1_1GScip#ad8b6b87e1106371b67be3c718c9bc8b8 "operations_research::GScip::SetUb" (SCIP_VAR *var, double ub)</dt><dd> \anchor _todo000721 (b/246342145): A crash may occur if you attempt to set an ub >= 2.0 on
a binary variable. SCIP can also silently change the vartype of a variable
after construction, so you should check it via <tt>VarType()</tt>.
</dd> <dt>
\_setscope operations_research::GScip Member \_internalref classoperations__research_1_1GScip#abd814a95231026c9313c8dc2284ac4a5 "operations_research::GScip::Solve" (const GScipParameters ¶ms=GScipParameters(), absl::string_view legacy_params="", GScipMessageHandler message_handler=nullptr, const Interrupter *interrupter=nullptr)</dt><dd> \anchor _todo000719 (user): refactor this into a new method.
</dd> <dt>
\_setscope operations_research::GScipConstraintHandlerContext Class \_internalref classoperations__research_1_1GScipConstraintHandlerContext "operations_research::GScipConstraintHandlerContext" </dt><dd> \anchor _todo000725 (user): Add support for branching.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a8fbf8182ca5ad94ee75198ac1885d798 "operations_research::GScipCreateMaximum" (GScip *gscip, const GScipLinearExpr &resultant, const std::vector< GScipLinearExpr > &terms, absl::string_view name)</dt><dd> \anchor _todo000729 (user): it may be better to write this in terms of the disjuntive
constraint, we need to support disjunctions in gscip.h to do this.</dd> <dt>
\_setscope operations_research::GScipEventHandler Member \_internalref classoperations__research_1_1GScipEventHandler#a55733bd35aafd3ae06df04760d7fe05d "operations_research::GScipEventHandler::CatchEvent" (SCIP_EVENTTYPE event_type)</dt><dd> \anchor _todo000727 (user): Support Var and Row events.<p> \anchor _todo000728 (user): Support registering events in the EVENTINITSOL
callback, which would cause them to be trapped only after presolve.
</dd> <dt>
\_setscope operations_research::GScipLinearExpr Struct \_internalref structoperations__research_1_1GScipLinearExpr "operations_research::GScipLinearExpr" </dt><dd> \anchor _todo000731 (user): delete this type and the methods below, use a generic version
templated on the variable type that supports operator overloads.
</dd> <dt>
\_setscope operations_research::GScipQuadraticRange Member \_internalref structoperations__research_1_1GScipQuadraticRange#a625a69d159292a2c717436158af9bece "operations_research::GScipQuadraticRange::quadratic_variables1" </dt><dd> \anchor _todo000723 (user): investigate, the documentation seems to suggest that when
linear_variables[i] == quadratic_variables1[i] == quadratic_variables2[i]
there is some advantage.
</dd> <dt>
\_setscope operations_research::GuidedTabuSearch Member \_internalref classoperations__research_1_1GuidedTabuSearch#a3b432dccc848e7c957cfe8e4ebb3919a "operations_research::GuidedTabuSearch::NextSolution" (const std::vector< SubsetIndex > &focus, int num_iterations)</dt><dd> \anchor _todo000042 (user): make the cost computation incremental.
</dd> <dt>
\_setscope operations_research::GuidedTabuSearch Member \_internalref classoperations__research_1_1GuidedTabuSearch#a276460a461462ece00e2b69a4ba0cc75 "operations_research::GuidedTabuSearch::SetLagrangianFactor" (double factor)</dt><dd> \anchor _todo000049 (user): re-introduce this is the code. It was used to favor
subsets with the same marginal costs but that would cover more elements.
But first, see if it makes sense to compute it.
</dd> <dt>
\_setscope operations_research::GurobiInterface Member \_internalref classoperations__research_1_1GurobiInterface#a47ea0f16d10d18c841917b6ab3695094 "operations_research::GurobiInterface::ClearConstraint" (MPConstraint *constraint) override</dt><dd> \anchor _todo000755 (user): this is difficult to make incremental, like
SetConstraintBounds(), because of the auxiliary Gurobi variables that
range constraints introduce.
</dd> <dt>
\_setscope operations_research::GurobiInterface Member \_internalref classoperations__research_1_1GurobiInterface#a80f01ad50450397a74e29c3db67ff69c "operations_research::GurobiInterface::ComputeExactConditionNumber" () const override</dt><dd> \anchor _todo000758 (user): Not yet working.
</dd> <dt>
\_setscope operations_research::GurobiInterface Member \_internalref classoperations__research_1_1GurobiInterface#abdc377748278a3c5c35a847bfd146a31 "operations_research::GurobiInterface::NextSolution" () override</dt><dd> \anchor _todo000757 (user): This reset may not be necessary, investigate.
</dd> <dt>
\_setscope operations_research::GurobiInterface Member \_internalref classoperations__research_1_1GurobiInterface#a3151b55e2c525025b89ce0c01cdf52be "operations_research::GurobiInterface::SetCoefficient" (MPConstraint *constraint, const MPVariable *variable, double new_value, double old_value) override</dt><dd> \anchor _todo000754 (user): investigate if this has bad performance.
</dd> <dt>
\_setscope operations_research::GurobiInterface Member \_internalref classoperations__research_1_1GurobiInterface#a937c9e7503e0bc746f8fa40c7591f16a "operations_research::GurobiInterface::SetConstraintBounds" (int row_index, double lb, double ub) override</dt><dd> \anchor _todo000753 (user): this is nontrivial to make incremental:
1. Make sure it is a linear constraint (not an indicator or indicator
range constraint).
2. Check if the sense of the constraint changes. If it was previously a
range constraint, we can do nothing, and if it becomes a range
constraint, we can do nothing. We could support range constraints if
we tracked the auxiliary variable that is added with range
constraints.
</dd> <dt>
\_setscope operations_research::GurobiInterface Member \_internalref classoperations__research_1_1GurobiInterface#a3fdaaef4033cbc2f6e0ef07ade784682 "operations_research::GurobiInterface::Solve" (const MPSolverParameters ¶m) override</dt><dd> \anchor _todo000756 (user): We could introduce our own "infeasible or unbounded" status.
</dd> <dt>
\_setscope operations_research::HamiltonianPathSolver Member \_internalref classoperations__research_1_1HamiltonianPathSolver#ab7380d5367176d7d567876433d1dd918 "operations_research::HamiltonianPathSolver< CostType, CostFunction >::Integer" </dt><dd> \anchor _todo000645 (user): remove this limitation by using pruning techniques.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#aee1401375b23909949cce272a3b787db "operations_research::Hash1" (uint64_t value)</dt><dd> \anchor _todo000151 (user): use murmurhash.
</dd> <dt>
\_setscope operations_research::HighsInterface Member \_internalref classoperations__research_1_1HighsInterface#aa0445eec4920c34b74fb03b837ff15b0 "operations_research::HighsInterface::column_status" (int variable_index) const override</dt><dd> \anchor _todo000761 (user): While basis status isn't well defined for PDLP, we could
guess statuses that might be useful.
</dd> <dt>
\_setscope operations_research::HighsInterface Member \_internalref classoperations__research_1_1HighsInterface#a0b4fdd0d963276c0deca473d6b4b36a5 "operations_research::HighsInterface::row_status" (int constraint_index) const override</dt><dd> \anchor _todo000760 (user): While basis status isn't well defined for PDLP, we could
guess statuses that might be useful.
</dd> <dt>
\_setscope operations_research::HighsInterface Member \_internalref classoperations__research_1_1HighsInterface#a9423aab732ca4e92e3640bd534e92023 "operations_research::HighsInterface::underlying_solver" () override</dt><dd> \anchor _todo000762 (user): Consider returning the SolveLog here, as it could be essential
for interpreting the PDLP solution.
</dd> <dt>
\_setscope operations_research::InsertionSequenceContainer Member \_internalref classoperations__research_1_1InsertionSequenceContainer#a2d8c1748584bee64a6e1963605863c6b "operations_research::InsertionSequenceContainer::RemoveIf" (const std::function< bool(const InsertionSequence &)> &p)</dt><dd> \anchor _todo000371 (user): Benchmark this against std::swap().
</dd> <dt>
\_setscope operations_research::InsertionSequenceContainer Member \_internalref classoperations__research_1_1InsertionSequenceContainer#a7d4b83eb22546e3c1079283001dfe0d3 "operations_research::InsertionSequenceContainer::Sort" ()</dt><dd> \anchor _todo000372 (user): benchmark this against other ways to get insertion
sequence in order, for instance sorting by index, separating {cost, index},
making a heap.
</dd> <dt>
\_setscope operations_research::IntegerPriorityQueue Member \_internalref classoperations__research_1_1IntegerPriorityQueue#a660816e2b5398fc18dd92a58327f630c "operations_research::IntegerPriorityQueue< Element, Compare >::Clear" ()</dt><dd> \anchor _todo002376 (user): we could make this sparse if it is needed.
</dd> <dt>
\_setscope operations_research::internal Namespace \_internalref namespaceoperations__research_1_1internal "operations_research::internal" </dt><dd> \anchor _todo000036 (user): Support arbitrary types with an int() or other numerical getter.
<p> <p>(user): Support the user providing already-allocated memory buffers
for the radix counts and/or for the temporary vector<T> copy.
</dd> <dt>
\_setscope operations_research::internal::MPSLineInfo Member \_internalref classoperations__research_1_1internal_1_1MPSLineInfo#a86c8ac962db03549a6a2ae20911e8c23 "operations_research::internal::MPSLineInfo::IsNewSection" () const</dt><dd> \anchor _todo000853 (b/284163180): Fix handling of sections and data in <tt>free_form</tt>.
Returns true if the line defines a new section.
</dd> <dt>
\_setscope operations_research::IntVar Member \_internalref classoperations__research_1_1IntVar#af3c6b509b9279db09301192b57dfb3cd "operations_research::IntVar::RemoveValues" (const std::vector< int64_t > &values)</dt><dd> \anchor _todo000184 (user): Check and maybe inline this code.
<p> \anchor _todo000185 (user) : Sort values!
</dd> <dt>
\_setscope operations_research::IntVar Member \_internalref classoperations__research_1_1IntVar#a3b3b2ee0dc78430a3008c0894531196f "operations_research::IntVar::SetValues" (const std::vector< int64_t > &values)</dt><dd> \anchor _todo000186 (user): use a clean and safe SortedUniqueCopy() class
that uses a global, static shared (and locked) storage.
<p> \anchor _todo000187 <p> \anchor _todo000188 (user): [optional] consider porting
STLSortAndRemoveDuplicates from ortools/base/stl_util.h to the
existing base/stl_util.h and using it here.
<p> \anchor _todo000189 <p> \anchor _todo000190 (user): We could filter out values not in the var.
<p> \anchor _todo000191 (user) : We could find the first position >= vmin by dichotomy.
</dd> <dt>
\_setscope operations_research::IntVarFilteredDecisionBuilder Class \_internalref classoperations__research_1_1IntVarFilteredDecisionBuilder "operations_research::IntVarFilteredDecisionBuilder" </dt><dd> \anchor _todo000369 (user): Eventually move this to the core CP solver library
when the code is mature enough.
</dd> <dt>
\_setscope operations_research::IntVarLocalSearchOperator Member \_internalref classoperations__research_1_1IntVarLocalSearchOperator#ac8bc688def85b27b6aa66e1f099050a4 "operations_research::IntVarLocalSearchOperator::MakeOneNeighbor" ()</dt><dd> \anchor _todo000153 (user): make it pure virtual, implies porting all apps overriding
MakeNextNeighbor() in a subclass of IntVarLocalSearchOperator.
<p> \anchor _todo000214 (user): Make this a pure virtual.
</dd> <dt>
\_setscope operations_research::KnapsackAssignment Struct \_internalref structoperations__research_1_1KnapsackAssignment "operations_research::KnapsackAssignment" </dt><dd> \anchor _todo000031 (user): Add a new propagator class for conflict constraint.
<p> <p>(user): Add a new propagator class used as a guide when the problem has
several dimensions.
</dd> <dt>
\_setscope operations_research::KnapsackBruteForceSolver Member \_internalref classoperations__research_1_1KnapsackBruteForceSolver#a0b4c315873262155800b2645fdab0535 "operations_research::KnapsackBruteForceSolver::Init" (const std::vector< int64_t > &profits, const std::vector< std::vector< int64_t > > &weights, const std::vector< int64_t > &capacities) override</dt><dd> \anchor _todo000030 (user): Implement multi-dimensional brute force solver.
</dd> <dt>
\_setscope operations_research::KnapsackCapacityPropagator Member \_internalref classoperations__research_1_1KnapsackCapacityPropagator#af1d7d1e175e652c64962af490ab42247 "operations_research::KnapsackCapacityPropagator::ComputeProfitBounds" () override</dt><dd> \anchor _todo000029 (user): Make it more incremental, by saving the break item in a
search node for instance.
</dd> <dt>
\_setscope operations_research::KnapsackGenericSolver Class \_internalref classoperations__research_1_1KnapsackGenericSolver "operations_research::KnapsackGenericSolver" </dt><dd> \anchor _todo000032 (user): In the case of a multi-dimensional knapsack problem, implement
an aggregated propagator to combine all dimensions and give a better guide
to select the next item (see, for instance, Dobson's aggregated efficiency).
</dd> <dt>
\_setscope operations_research::KnapsackInterface Member \_internalref classoperations__research_1_1KnapsackInterface#ac5b423c249b7d295b22cd367d60a915a "operations_research::KnapsackInterface::column_status" (int variable_index) const override</dt><dd> \anchor _todo000766 (user): set properly.
</dd> <dt>
\_setscope operations_research::KnapsackInterface Member \_internalref classoperations__research_1_1KnapsackInterface#a91cb6e2a4e0c037e5ce12887e13d5a11 "operations_research::KnapsackInterface::row_status" (int constraint_index) const override</dt><dd> \anchor _todo000765 (user): set properly.
</dd> <dt>
\_setscope operations_research::KnapsackInterface Member \_internalref classoperations__research_1_1KnapsackInterface#ad8e2065e33ed1870e473b6f296a93cba "operations_research::KnapsackInterface::Solve" (const MPSolverParameters ¶m) override</dt><dd> \anchor _todo000764 (user): Refine Analysis of the model to choose better solvers.
</dd> <dt>
\_setscope operations_research::LatticeMemoryManager Member \_internalref classoperations__research_1_1LatticeMemoryManager#af1eb6109d2fbc58a4f9709fc12472100 "operations_research::LatticeMemoryManager< Set, CostType >::BaseOffset" (int card, Set s) const</dt><dd> \anchor _todo000639 (user): Evaluate the interest of the above.
There are 'card' f(set, j) to store. That is why we need to multiply
local_offset by card before adding it to the corresponding base_offset_.
<p> \anchor _todo000644 (user): Investigate how to compute BaseOffset(card - 1, s \ { n })
from BaseOffset(card, n) to speed up the DP iteration.
</dd> <dt>
\_setscope operations_research::LightPairRelocateOperator Class \_internalref classoperations__research_1_1LightPairRelocateOperator "operations_research::LightPairRelocateOperator" </dt><dd> \anchor _todo000342 (user): Add a version which inserts the first node before the other
pair's first node; there are many redundant neighbors if done blindly.
</dd> <dt>
\_setscope operations_research::LightPairRelocateOperator Member \_internalref classoperations__research_1_1LightPairRelocateOperator#ab5a8f9eadcc60ebb142f301ad0206f45 "operations_research::LightPairRelocateOperator::MakeNeighbor" () override</dt><dd> \anchor _todo000335 (user): extend to relocating before the start of sub-tours (when
all pairs have been matched).
<p> \anchor _todo000336 (user): Add support for lifo for neighbor-based move.
</dd> <dt>
\_setscope operations_research::LinearExpr Member \_internalref classoperations__research_1_1LinearExpr#ac387e7f248b39ad0c52ad355fa646696 "operations_research::LinearExpr::ToString" () const</dt><dd> \anchor _todo000767 (user): support optionally cropping long strings.
</dd> <dt>
\_setscope operations_research::LocalCheapestInsertionFilteredHeuristic Member \_internalref classoperations__research_1_1LocalCheapestInsertionFilteredHeuristic#a17ef6d7c3d54257ff4089b5d131a65e3 "operations_research::LocalCheapestInsertionFilteredHeuristic::LocalCheapestInsertionFilteredHeuristic" (RoutingModel *model, std::function< bool()> stop_search, std::function< int64_t(int64_t, int64_t, int64_t)> evaluator, RoutingSearchParameters::PairInsertionStrategy pair_insertion_strategy, LocalSearchFilterManager *filter_manager, BinCapacities *bin_capacities=nullptr, std::function< bool(const std::vector< RoutingModel::VariableValuePair > &, std::vector< RoutingModel::VariableValuePair > *)> optimize_on_insertion=nullptr)</dt><dd> \anchor _todo000358 (user): Add support for penalty costs.
</dd> <dt>
\_setscope operations_research::LocalDimensionCumulOptimizer Member \_internalref classoperations__research_1_1LocalDimensionCumulOptimizer#a30f6536c9b12eb7d0c6bcba75c50b158 "operations_research::LocalDimensionCumulOptimizer::LocalDimensionCumulOptimizer" (const RoutingDimension *dimension, RoutingSearchParameters::SchedulingSolver solver_type)</dt><dd> \anchor _todo000325 (user): Instead of passing false, detect if the relaxation
will always violate the MIPL constraints.
</dd> <dt>
\_setscope operations_research::LocalSearch Member \_internalref classoperations__research_1_1LocalSearch#a60a6c0d04aae31557a3f80a43e578c1d "operations_research::LocalSearch::LocalSearch" (const std::vector< IntVar * > &vars, IntVar *objective, SolutionPool *pool, DecisionBuilder *first_solution, LocalSearchOperator *ls_operator, DecisionBuilder *sub_decision_builder, RegularLimit *limit, LocalSearchFilterManager *filter_manager)</dt><dd> \anchor _todo000238 (user): find a way to not have to pass vars here: redundant with
variables in operators
</dd> <dt>
\_setscope operations_research::LocalSearch Member \_internalref classoperations__research_1_1LocalSearch#aad8272c1b2ace102d8ee023e3dbbc92e "operations_research::LocalSearch::Next" (Solver *solver) override</dt><dd> \anchor _todo000233 (user): abstract this from the local search part
<p> <p>(user): handle the case where the tree depth is not enough to hold
all solutions.
<p> \anchor _todo000234 (user): Find a way to make this balancing invisible to the
user (no increase in branch or fail counts for instance).
</dd> <dt>
\_setscope operations_research::LocalSearchFilter Member \_internalref classoperations__research_1_1LocalSearchFilter#a7ba0d3a0fab70da68c44fcc603b29bc9 "operations_research::LocalSearchFilter::Accept" (const Assignment *delta, const Assignment *deltadelta, int64_t objective_min, int64_t objective_max)=0</dt><dd> \anchor _todo000157 (user): Remove arguments when there are no more need for those.
</dd> <dt>
\_setscope operations_research::LocalSearchFilterManager Member \_internalref classoperations__research_1_1LocalSearchFilterManager#af14f814b5f03c25c7a5c34ea2e850931 "operations_research::LocalSearchFilterManager::Accept" (LocalSearchMonitor *monitor, const Assignment *delta, const Assignment *deltadelta, int64_t objective_min, int64_t objective_max)</dt><dd> \anchor _todo000224 (user): the behaviour of Accept relies on the initial order of
filters having at most one filter with negative objective values,
this could be fixed by having filters return their general bounds.
<p> \anchor _todo000225 (user): handle objective min.
</dd> <dt>
\_setscope operations_research::LocalSearchMonitor Member \_internalref classoperations__research_1_1LocalSearchMonitor#a0c4974eabff96027f2732bd11aa6acb8 "operations_research::LocalSearchMonitor::LocalSearchMonitor" (Solver *solver)</dt><dd> \anchor _todo000158 (user): Add monitoring of local search filters.
</dd> <dt>
\_setscope operations_research::LocalSearchOperator Class \_internalref classoperations__research_1_1LocalSearchOperator "operations_research::LocalSearchOperator" </dt><dd> \anchor _todo000152 (user): rename Start to Synchronize ?
<p> <p>(user): decouple the iterating from the defining of a neighbor.
</dd> <dt>
\_setscope operations_research::LocalSearchState Member \_internalref classoperations__research_1_1LocalSearchState#ab21fa79fdab637a71137bfb392c3bc42 "operations_research::LocalSearchState::Commit" ()</dt><dd> \anchor _todo000223 (user): When the class has more users, find a threshold ratio of
saved/total domains under which a sparse clear would be more efficient
for both Commit() and Revert().
</dd> <dt>
\_setscope operations_research::LocationContainer Member \_internalref classoperations__research_1_1LocationContainer#ad936b94007fe596c6ac61668da043262 "operations_research::LocationContainer::SameLocationFromIndex" (int64_t node1, int64_t node2) const</dt><dd> \anchor _todo001019 (user): Fetch proper indices from routing model.
</dd> <dt>
\_setscope operations_research::MakeActiveOperator Member \_internalref classoperations__research_1_1MakeActiveOperator#a7600694afcf25f72395f32bfea5b0b6d "operations_research::MakeActiveOperator::MakeNeighbor" () override</dt><dd> \anchor _todo000217 (user): Add support for neighbors of inactive nodes; would require
having a version without base nodes (probably not a PathOperator).
</dd> <dt>
\_setscope operations_research::MakePairActiveOperator Class \_internalref classoperations__research_1_1MakePairActiveOperator "operations_research::MakePairActiveOperator" </dt><dd> \anchor _todo000341 (user): Add option to prune neighbords where the order of node pairs
is violated (ie precedence between pickup and delivery nodes).
<p> <p>(user): Move this to local_search.cc if it's generic enough.
<p> <p>(user): Detect pairs automatically by parsing the constraint model;
we could then get rid of the pair API in the RoutingModel
class.
</dd> <dt>
\_setscope operations_research::MakeRelocateNeighborsOperator Class \_internalref classoperations__research_1_1MakeRelocateNeighborsOperator "operations_research::MakeRelocateNeighborsOperator" </dt><dd> \anchor _todo000339 (user): Consider merging with standard Relocate in local_search.cc.
</dd> <dt>
\_setscope operations_research::MakeRelocateNeighborsOperator Member \_internalref classoperations__research_1_1MakeRelocateNeighborsOperator#a68fcef23cc239d8bc9f7864595a05d5e "operations_research::MakeRelocateNeighborsOperator::MakeNeighbor" () override</dt><dd> \anchor _todo000334 (user): Add a parameter to either return false or break here,
depending if we want to permutate nodes within the same chain.
</dd> <dt>
\_setscope operations_research::math_opt Namespace \_internalref namespaceoperations__research_1_1math__opt "operations_research::math_opt" </dt><dd> \anchor _todo000932 (b/178702980): this should not be needed
IWYU pragma: no_include <type_traits>
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ab2cf3d362a53b88af5478096e7b70534 "operations_research::math_opt::≤" (variable bounds) TEST_P(InfeasibleSubsystemTest</dt><dd> \anchor _todo000918 (b/227217735): Test ranged quadratic constraints when supported.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ae492beecf00c5bcfab49f0eb64bd5467 "operations_research::math_opt::ApplyAllFilters" (const ModelSolveParametersProto &model_solve_params, SolutionProto &solution)</dt><dd> \anchor _todo000885 (b/261603235): this function is not very efficient, decide if this
matters.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#abd2e26542d0c64cb9bdb653e943cd892 "operations_research::math_opt::CheckIdsSubset" (absl::Span< const int64_t > ids, const IdNameBiMap &universe, std::optional< int64_t > upper_bound)</dt><dd> \anchor _todo000988 (b/232526223): try merge this with the CheckIdsSubset overload below, or
at least have one call the other.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a614c1a306a138f7593f4ae84dbf034c9 "operations_research::math_opt::FeasibleTerminationProto" (const bool is_maximize, const LimitProto limit, const double primal_objective, const std::optional< double > optional_dual_objective, const absl::string_view detail)</dt><dd> \anchor _todo000888 (b/290359402): Consider improving to require a finite dual bound when
dual feasible solutions are returned.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ad41bc1edd376b9ab7c3182d9a7b35e87 "operations_research::math_opt::FilterSparseVector" (const SparseDoubleVectorProto &input, const SparseVectorFilterProto &filter)</dt><dd> \anchor _todo000884 (b/261603235): this function is not very efficient, decide if this
matters.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a635b90e2d284268536fc4bd2a4ce2ac4 "operations_research::math_opt::GetObjectiveBounds" (const SolveResultProto &solve_result)</dt><dd> \anchor _todo000882 (b/290091715): Remove once solve_stats.best_primal/dual_bound is removed
and we know termination.objective_bounds will always be present.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a5e3e49ddac3e4cb09a02f02e4fe83019 "operations_research::math_opt::GetProblemStatus" (const SolveResultProto &solve_result)</dt><dd> \anchor _todo000883 (b/290091715): Remove once solve_stats.problem_status is removed and we
know termination.problem_status will always be present.
</dd> <dt>
\_setscope operations_research::math_opt::GlpkSolver Member \_internalref classoperations__research_1_1math__opt_1_1GlpkSolver#ae0dd8a4b4d2f341b1300cf539b74bcda "operations_research::math_opt::GlpkSolver::Solve" (const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, SolveInterrupter *interrupter) override</dt><dd> \anchor _todo000942 (b/187027049): compute the dual value when the dual is feasible (or
problem optimal for interior point) based on the bounds and the dual values
for LPs.
<p> \anchor _todo000940 (b/187027049): add solver specific parameters for
glp_iptcp.ord_alg.
<p> \anchor _todo000938 (b/187027049): glp_intopt with presolve off requires an optional
solution of the relaxed problem. Here we simply always enable pre-solve
but we should support disabling the presolve and call glp_simplex() in
that case.
<p> \anchor _todo000939 (b/259557110): the emptiness is tested by glp_interior() <em>after</em>
some pre-processing (including removing fixed variables). The current
IsEmpty() is thus not good enough to deal with all cases.
<p> \anchor _todo000941 (b/187027049): add option to use glp_exact().
</dd> <dt>
\_setscope operations_research::math_opt::GScipSolver Member \_internalref classoperations__research_1_1math__opt_1_1GScipSolver#a91f57e875b852057eeaf6eeb837d1613 "operations_research::math_opt::GScipSolver::Update" (const ModelUpdateProto &model_update) override</dt><dd> \anchor _todo000950 (b/215722113): maybe we could use SCIPaddCoefLinear() for sub-matrix 1.
</dd> <dt>
\_setscope operations_research::math_opt::GurobiSolver Member \_internalref classoperations__research_1_1math__opt_1_1GurobiSolver#ab38e5151045e42072028984828eeefc5 "operations_research::math_opt::GurobiSolver::ComputeInfeasibleSubsystem" (const SolveParametersProto ¶meters, MessageCallback message_cb, SolveInterrupter *interrupter) override</dt><dd> \anchor _todo000967 (b/277246682): ensure that resetting parameters does not degrade
incrementalism performance.
<p> \anchor _todo000966 (b/277339044): Remove code duplication with GurobiSolver::Solve().
</dd> <dt>
\_setscope operations_research::math_opt::GurobiSolver Member \_internalref classoperations__research_1_1math__opt_1_1GurobiSolver#a26f4dd4213100e750b8253e394abf91a "operations_research::math_opt::GurobiSolver::Solve" (const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, SolveInterrupter *interrupter) override</dt><dd> \anchor _todo000965 (b/277246682): ensure that resetting parameters does not degrade
incrementalism performance.
</dd> <dt>
\_setscope operations_research::math_opt::internal Member \_internalref namespaceoperations__research_1_1math__opt_1_1internal#aa5b5865fba481a062135fc78e632b85c "operations_research::math_opt::internal::CheckIdsRangeAndStrictlyIncreasing2" (absl::Span< const int64_t > ids)</dt><dd> \anchor _todo000890 (b/232526223): this is an exact copy of
CheckIdsRangeAndStrictlyIncreasing from ids_validator.h, find a way to share
the code.
</dd> <dt>
\_setscope operations_research::math_opt::InvalidInputTest Class \_internalref classoperations__research_1_1math__opt_1_1InvalidInputTest "operations_research::math_opt::InvalidInputTest" </dt><dd> \anchor _todo000919 (b/172553545): this test should not be repeated for each solver since it
tests that the Solver class validates the model before calling the
interface.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#af9843a1d7731647c94c6a7ae14cdd2da "operations_research::math_opt::IsOptimal" (const std::optional< double > expected_primal_objective, const double tolerance)</dt><dd> \anchor _todo000895 (b/309658404): Note the bounds should be at least finite once we validate
this.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ac307abe62a9d26ff0eac456704d950b6 "operations_research::math_opt::LimitTerminationProto" (LimitProto limit, const double primal_objective, const double dual_objective, const bool claim_dual_feasible_solution_exists, const absl::string_view detail)</dt><dd> \anchor _todo000889 (b/290359402): Consider improving to require a finite dual bound when
dual feasible solutions are returned.
</dd> <dt>
\_setscope operations_research::math_opt::LinearExpression Class \_internalref classoperations__research_1_1math__opt_1_1LinearExpression "operations_research::math_opt::LinearExpression" </dt><dd> \anchor _todo000911 (b/169415098): add a function to remove zero terms.
<p> <p>(b/169415834): study if exact zeros should be automatically removed.
<p> <p>(b/169415103): add tests that some expressions don't compile.
</dd> <dt>
\_setscope operations_research::math_opt::LpIncompleteSolveTestParams Struct \_internalref structoperations__research_1_1math__opt_1_1LpIncompleteSolveTestParams "operations_research::math_opt::LpIncompleteSolveTestParams" </dt><dd> \anchor _todo000924 (b/195295177): Consider splitting LpIncompleteSolveTest into simplex and
non-simplex tests to avoid repetition and need to input irrelevant bools from
LpIncompleteSolveTestParams when instantiating tests.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a5d8c9048c51c1bc6685751a7cb8514fe "operations_research::math_opt::MathOptModelToMPModelProto" (const ::operations_research::math_opt::ModelProto &model)</dt><dd> \anchor _todo000913 (user): use the constraint iterator from scip_solver.cc here.
</dd> <dt>
\_setscope operations_research::math_opt::Model Member \_internalref classoperations__research_1_1math__opt_1_1Model#a06cd12d3df5d04b34fde1050692bc46a "operations_research::math_opt::Model::storage" () const</dt><dd> \anchor _todo000899 (user): expose a way to efficiently iterate through the nonzeros of
the linear constraint matrix.
</dd> <dt>
\_setscope operations_research::math_opt::Model Member \_internalref classoperations__research_1_1math__opt_1_1Model#a737b42a14db864ac3afa891ecb212688 "operations_research::math_opt::Model::ValidateExistingLinearConstraintOfThisModel" (LinearConstraint linear_constraint) const</dt><dd> \anchor _todo000898 (b/239810718): use << for LinearConstraint once it does not CHECK.
</dd> <dt>
\_setscope operations_research::math_opt::Model Member \_internalref classoperations__research_1_1math__opt_1_1Model#ae3a2f02a80238331fcdb90fc410682df "operations_research::math_opt::Model::ValidateExistingVariableOfThisModel" (Variable variable) const</dt><dd> \anchor _todo000897 (b/239810718): use << for Variable once it does not CHECK.
</dd> <dt>
\_setscope operations_research::math_opt::ModelSolveParameters Member \_internalref structoperations__research_1_1math__opt_1_1ModelSolveParameters#a7f2865236a76bb6d14d3ac4accae433c "operations_research::math_opt::ModelSolveParameters::Proto" () const</dt><dd> \anchor _todo000900 : b/315974557 - Return an error if a RepeatedField is too long.
<p> \anchor _todo000901 (b/183616124): consolidate code. Probably best to add an
export_to_proto to IdMap
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#afa94d25b431c19de213fd01276bda3bf "operations_research::math_opt::MoveVariablesToTheirBestFeasibleValue" (const Model &model, const VariableMap< double > &input_solution, absl::Span< const Variable > variables, const MoveVariablesToTheirBestFeasibleValueOptions &options)</dt><dd> \anchor _todo000914 (b/193121090): here we build the proto as the APIs of MathOpt only
works with the proto and can't use the C++ Model (or ModelStorage).
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a647b24c008c0cab90f59e848a507c244 "operations_research::math_opt::NoSolutionFoundTerminationProto" (const bool is_maximize, const LimitProto limit, const std::optional< double > optional_dual_objective, const absl::string_view detail)</dt><dd> \anchor _todo000887 (b/290359402): Consider improving to require a finite dual bound when
dual feasible solutions are returned.
</dd> <dt>
\_setscope operations_research::math_opt::ObjectiveStorage::Diff Member \_internalref structoperations__research_1_1math__opt_1_1ObjectiveStorage_1_1Diff#a269e380e623c1a8a281290585bb0c24f "operations_research::math_opt::ObjectiveStorage::Diff::objective_diffs" </dt><dd> \anchor _todo000973 (b/259109678): Consider storing primary objective separately (like in
<tt>ObjectiveStorage</tt>) if hashing is a noticeable bottleneck.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#af7ba8f15f41011f5b8109d7bef66511f "operations_research::math_opt::operator<<" (std::ostream &ostr, const QuadraticConstraint &constraint)</dt><dd> \anchor _todo000878 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a99d303a9027f99623639c132198aa097 "operations_research::math_opt::operator<<" (std::ostream &ostr, const LinearConstraint &linear_constraint)</dt><dd> \anchor _todo000894 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ae8f450a61d6f3613fa723a717c3cbca3 "operations_research::math_opt::operator<<" (std::ostream &ostr, const Variable &variable)</dt><dd> \anchor _todo000912 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a529b5def5ea854858d5e3a6c094a0988 "operations_research::math_opt::operator<<" (std::ostream &ostr, const IndicatorConstraint &constraint)</dt><dd> \anchor _todo000877 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a5db056654e1d14286315339c41c1bff0 "operations_research::math_opt::operator<<" (std::ostream &ostr, const Objective &objective)</dt><dd> \anchor _todo000902 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a9019e3ceb6908ea58dee5e0ea0e627f9 "operations_research::math_opt::operator<<" (std::ostream &ostr, const QuadraticExpression &expr)</dt><dd> \anchor _todo000910 (b/169415597): improve quadratic expression formatting. See b/170991498
for desired improvements for LinearExpression streaming which are also
applicable here.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ab1d61842701172037b05e011df664d90 "operations_research::math_opt::operator<<" (std::ostream &ostr, const LinearExpression &expression)</dt><dd> \anchor _todo000909 (b/169415597): improve linear expression format:
- make sure to quote the variable name so that we support:
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#af810f3a175629e517744c9f265470b61 "operations_research::math_opt::operator<<" (std::ostream &ostr, const Sos2Constraint &constraint)</dt><dd> \anchor _todo000881 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a96a74dc7a0e6aa81c2279481c4c1e678 "operations_research::math_opt::operator<<" (std::ostream &ostr, const SecondOrderConeConstraint &constraint)</dt><dd> \anchor _todo000879 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a1a9e610368627bfdb61a92bc85274327 "operations_research::math_opt::operator<<" (std::ostream &ostr, const Sos1Constraint &constraint)</dt><dd> \anchor _todo000880 (b/170992529): handle quoting of invalid characters in the name.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#a3f1deb6f9bb763a7c2635992bec9dcf9 "operations_research::math_opt::OptimalTerminationProto" (const double finite_primal_objective, const double dual_objective, const absl::string_view detail)</dt><dd> \anchor _todo000886 (b/290359402): additionally require dual_objective to be finite.
</dd> <dt>
\_setscope operations_research::math_opt::PdlpBridge Member \_internalref classoperations__research_1_1math__opt_1_1PdlpBridge#a5be3dbbc95b4b889956096613a822e40 "operations_research::math_opt::PdlpBridge::PrimalVariablesToProto" (const Eigen::VectorXd &primal_values, const SparseVectorFilterProto &variable_filter) const</dt><dd> \anchor _todo000969 (b/183616124): we need to support the inverse of these methods for
warm start.
</dd> <dt>
\_setscope operations_research::math_opt::SimpleMipTestParameters Member \_internalref structoperations__research_1_1math__opt_1_1SimpleMipTestParameters#ac01adb283c3825d2dc482c74306d2766 "operations_research::math_opt::SimpleMipTestParameters::report_unboundness_correctly" </dt><dd> \anchor _todo000930 (b/202159173): remove this when we start using the direct CP-SAT API
and thus will be able to get proper details.
</dd> <dt>
\_setscope operations_research::math_opt::Solver Member \_internalref classoperations__research_1_1math__opt_1_1Solver#aa9c5136714d04b0c012116a57d64585f "operations_research::math_opt::Solver::Solve" (const SolveArgs &arguments)</dt><dd> \anchor _todo000892 (b/290091715): Remove once language specific structs can use new
messages.
<p> \anchor _todo000891 (b/168037341): we should validate the result maths. Since the result
can be filtered, this should be included in the solver_interface
implementations.
</dd> <dt>
\_setscope operations_research::math_opt::SolveResult Member \_internalref structoperations__research_1_1math__opt_1_1SolveResult#a2f2ad92942a8f4f841234b15c911f472 "operations_research::math_opt::SolveResult::FromProto" (const ModelStorage *model, const SolveResultProto &solve_result_proto)</dt><dd> \anchor _todo000905 (b/290091715): Remove once solve_stats proto no longer has
best_primal/dual_bound/problem_status and
problem_status/objective_bounds are guaranteed to be present in
termination proto.
</dd> <dt>
\_setscope operations_research::math_opt::SolveResult Member \_internalref structoperations__research_1_1math__opt_1_1SolveResult#af140dea39dec0ce602200f2d2b0cc2e9 "operations_research::math_opt::SolveResult::Proto" () const</dt><dd> \anchor _todo000908 (b/231134639): investigate removing the oneof from the proto.
</dd> <dt>
\_setscope operations_research::math_opt::SolveResultMatcherOptions Member \_internalref structoperations__research_1_1math__opt_1_1SolveResultMatcherOptions#ae41b54030c8d6d4345348e188263eb7b "operations_research::math_opt::SolveResultMatcherOptions::check_solutions_if_inf_or_unbounded" </dt><dd> \anchor _todo000896 (b/201099290): this is perhaps not a good default. Gurobi as
implemented is returning primal solutions for both unbounded and
infeasible problems. We need to add unit tests that inspect this value
and turn them on one solver at a time with a new parameter on
SimpleLpTestParameters.
</dd> <dt>
\_setscope operations_research::math_opt::SparseMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseMatrix#a1ef6c0a7d0962256e329df83b34a3668 "operations_research::math_opt::SparseMatrix< RowId, ColumnId >::column" (ColumnId column_id) const</dt><dd> \anchor _todo000984 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseMatrix#a5b93353672b48d531e16f26eeb6c1238 "operations_research::math_opt::SparseMatrix< RowId, ColumnId >::ColumnTerms" (ColumnId col_id) const</dt><dd> \anchor _todo000986 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseMatrix#a35c2edd872d547e250e828a62e65ce71 "operations_research::math_opt::SparseMatrix< RowId, ColumnId >::row" (RowId row_id) const</dt><dd> \anchor _todo000983 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseMatrix#af45684890602a0abd734552aef5b53eb "operations_research::math_opt::SparseMatrix< RowId, ColumnId >::RowTerms" (RowId row_id) const</dt><dd> \anchor _todo000985 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseMatrix#a6aca40055cfa8c9e5767ce467f5c89ae "operations_research::math_opt::SparseMatrix< RowId, ColumnId >::Terms" () const</dt><dd> \anchor _todo000987 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseMatrix#a346f0dd1bc945b8a3f6acce2f868b0f3 "operations_research::math_opt::SparseMatrix< RowId, ColumnId >::Update" (const absl::flat_hash_set< RowId > &deleted_rows, absl::Span< const RowId > new_rows, const absl::flat_hash_set< ColumnId > &deleted_columns, absl::Span< const ColumnId > new_columns, const absl::flat_hash_set< std::pair< RowId, ColumnId > > &dirty) const</dt><dd> \anchor _todo000977 (b/233630053) use iterator API.
<p> \anchor _todo000976 (b/233630053): use iterator API.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#ae7fd3ba62ed1002264117fa864e7144f "operations_research::math_opt::SparseSymmetricMatrix::Proto" () const</dt><dd> \anchor _todo000974 (b/233630053): reuse the allocation once an iterator API is
supported.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#a43ee2fbaa504f90f7690b0bf87861c97 "operations_research::math_opt::SparseSymmetricMatrix::RelatedVariables" (VariableId variable) const</dt><dd> \anchor _todo000979 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#a4568f0449320e9203ed9969bad5d26dd "operations_research::math_opt::SparseSymmetricMatrix::Terms" () const</dt><dd> \anchor _todo000981 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#a5daadc06a91ff1edeb4871b1801b84f9 "operations_research::math_opt::SparseSymmetricMatrix::Terms" (VariableId variable) const</dt><dd> \anchor _todo000980 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#a007fc8188b348177988fb88dffe12f3f "operations_research::math_opt::SparseSymmetricMatrix::Update" (const absl::flat_hash_set< VariableId > &deleted_variables, absl::Span< const VariableId > new_variables, const absl::flat_hash_set< std::pair< VariableId, VariableId > > &dirty) const</dt><dd> \anchor _todo000975 (b/233630053): do not allocate here.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#a6297413386fb1ed24d1a6087c3f900cb "operations_research::math_opt::SparseSymmetricMatrix::values" () const</dt><dd> \anchor _todo000982 (b/233630053): do not expose values_ directly, instead offer a way to
iterate over all the nonzero entries.
</dd> <dt>
\_setscope operations_research::math_opt::SparseSymmetricMatrix Member \_internalref classoperations__research_1_1math__opt_1_1SparseSymmetricMatrix#a89e72a700578de83bbd4eb42102bdc7a "operations_research::math_opt::SparseSymmetricMatrix::Variables" () const</dt><dd> \anchor _todo000978 (b/233630053): expose an iterator based API to avoid making a copy.
</dd> <dt>
\_setscope operations_research::math_opt::Termination Member \_internalref structoperations__research_1_1math__opt_1_1Termination#af377d01c6b7a7ccfa6b9e01da924eecf "operations_research::math_opt::Termination::Feasible" (bool is_maximize, Limit limit, double finite_primal_objective, std::optional< double > optional_dual_objective=std::nullopt, std::string detail={})</dt><dd> \anchor _todo000907 (b/290359402): Consider improving to require a finite dual bound when
dual feasible solutions are returned.
</dd> <dt>
\_setscope operations_research::math_opt::Termination Member \_internalref structoperations__research_1_1math__opt_1_1Termination#ad5e9dd557955e70d58d64666170ae6e8 "operations_research::math_opt::Termination::NoSolutionFound" (bool is_maximize, Limit limit, std::optional< double > optional_dual_objective=std::nullopt, std::string detail={})</dt><dd> \anchor _todo000906 (b/290359402): Consider improving to require a finite dual bound when
dual feasible solutions are returned.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#ac51b998f0ab120a1855bd589f2553fad "operations_research::math_opt::ValidateResult" (const SolveResultProto &result, const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)</dt><dd> \anchor _todo000990 (b/290091715): Remove once problem_status and objective bounds are
removed from solve_stats and their presence is guaranteed in termination.
<p> \anchor _todo000991 (b/290091715): Replace by
TerminationProto termination = result.termination();
once problem_status and objective bounds are removed from solve_stats and
their presence is guaranteed in termination.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#aa782b35203234b683975688b30f3110f "operations_research::math_opt::ValidateSolution" (const SolutionProto &solution, const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)</dt><dd> \anchor _todo000993 (b/204457524): consider checking equality of statuses for single-sided
LPs.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#add23cecedb126522044aca6764532ce3 "operations_research::math_opt::ValidateSolutions" (const google::protobuf::RepeatedPtrField< SolutionProto > &solutions, const ModelSolveParametersProto ¶meters, const ModelSummary &model_summary)</dt><dd> \anchor _todo000989 (b/204457524): check objective ordering when possible.
</dd> <dt>
\_setscope operations_research::math_opt Member \_internalref namespaceoperations__research_1_1math__opt#af099801286ce760f79dda3ce9b7be78d "operations_research::math_opt::ValidateSolveParameters" (const SolveParametersProto ¶meters)</dt><dd> \anchor _todo000995 (b/213697045): some parameters are still not validated.
</dd> <dt>
\_setscope operations_research::MaxFlow Class \_internalref classoperations__research_1_1MaxFlow "operations_research::MaxFlow" </dt><dd> \anchor _todo000663 (user): Modify this code and remove it.
</dd> <dt>
\_setscope operations_research::MinCostFlowBase Member \_internalref classoperations__research_1_1MinCostFlowBase#ae5cad0c7d9c3eddbc7c3aefbee060457a41523b94852c3cb55c86ce0e291e3719 "operations_research::MinCostFlowBase::BAD_COST_RANGE" </dt><dd> \anchor _todo000679 (user): this is not always properly checked and probably
deserve a different return status.
- Since we scale cost, each arc unit cost times (num_nodes + 1) should
not overflow. We detect that at the beginning of the Solve().
- This is however not sufficient as the node potential depends on the
minimum cost of sending 1 unit of flow through the residual graph. If
the maximum arc unit cost is smaller than kint64max / (2 * n ^ 2) then
one shouldn't run into any overflow. But in pratice this bound is quite
loose. So it is possible to try with higher cost, and the algorithm
will detect if an overflow actually happen and return BAD_COST_RANGE,
so we can retry with smaller cost.</dd> <dt>
\_setscope operations_research::MinCostPerfectMatching Member \_internalref classoperations__research_1_1MinCostPerfectMatching#a6f94ee8ea8298d25de3607ed56d2d94e "operations_research::MinCostPerfectMatching::AddEdgeWithCost" (int tail, int head, int64_t cost)</dt><dd> \anchor _todo000704 (user): We can easily shift all costs if negative costs are needed.<p> \anchor _todo000705 (user): We could just presolve them away.
</dd> <dt>
\_setscope operations_research::MinCostPerfectMatching Member \_internalref classoperations__research_1_1MinCostPerfectMatching#a4d798c6f197b745924e4e0ca184c3642 "operations_research::MinCostPerfectMatching::MinCostPerfectMatching" ()</dt><dd> \anchor _todo000702 (user): For now we ask the number of nodes at construction, but we
could automatically infer it from the added edges if needed.
</dd> <dt>
\_setscope operations_research::MinCostPerfectMatching Member \_internalref classoperations__research_1_1MinCostPerfectMatching#a5f89c8890f72a582d15baf027b9cfeb9 "operations_research::MinCostPerfectMatching::Reset" (int num_nodes)</dt><dd> \anchor _todo000703 (user): Eventually, we may support incremental Solves(). Or at least
memory reuse if one wants to solve many problems in a row.
</dd> <dt>
\_setscope operations_research::MinCostPerfectMatching Member \_internalref classoperations__research_1_1MinCostPerfectMatching#acce484fd341b33e5c371f0a1046821ed "operations_research::MinCostPerfectMatching::Solve" ()</dt><dd> \anchor _todo000683 (user): Improve the overflow detection if needed. The current one seems
ok though.
<p> \anchor _todo000684 (user): Maybe there is a faster/better way to recover the mapping
in the presence of blossoms.
</dd> <dt>
\_setscope operations_research::ModelSolverHelper Member \_internalref classoperations__research_1_1ModelSolverHelper#a0a3942146394eec75729ef0d79319237 "operations_research::ModelSolverHelper::Solve" (const ModelBuilderHelper &model)</dt><dd> \anchor _todo000813 (user): Enable interrupt_solve.
<p> \anchor _todo000812 <p> \anchor _todo000811 (user): Enable log_callback support.
</dd> <dt>
\_setscope operations_research::MPSolver Member \_internalref classoperations__research_1_1MPSolver#a84aec4c6ee3b17edc9979b12ecdb5f63 "operations_research::MPSolver::ComputeConstraintActivities" () const</dt><dd> \anchor _todo000774 (user): test this failure case.
</dd> <dt>
\_setscope operations_research::MPSolver Member \_internalref classoperations__research_1_1MPSolver#a9c8cc8b3c36fe9c08d8e0eefbc98b774 "operations_research::MPSolver::ExportModelToProto" (MPModelProto *output_model) const</dt><dd> \anchor _todo000771 (user): remove this step.
<p> \anchor _todo000770 (user): Add option to avoid filling the var name to avoid overly
large protocol buffers.
</dd> <dt>
\_setscope operations_research::MPSolver Member \_internalref classoperations__research_1_1MPSolver#aae2800c3df9ebf5f1e3c21cd5af3c9a9 "operations_research::MPSolver::LoadSolutionFromProto" (const MPSolutionResponse &response, double tolerance=std::numeric_limits< double >::infinity())</dt><dd> \anchor _todo000772 (user): Use parameter when they become available in this class.
</dd> <dt>
\_setscope operations_research::MPSolver Member \_internalref classoperations__research_1_1MPSolver#a9f2efb3304b325430e46e848574d63e5 "operations_research::MPSolver::Solve" (const MPSolverParameters ¶m)</dt><dd> \anchor _todo000773 (user): replace this by model extraction to proto + proto validation
(the proto has very low overhead compared to the wrapper, both in
performance and memory, so it's ok).
</dd> <dt>
\_setscope operations_research::MPSolver Member \_internalref classoperations__research_1_1MPSolver#a2a4a0234b5830d4ea82d549b3b6b5baf "operations_research::MPSolver::VerifySolution" (double tolerance, bool log_errors) const</dt><dd> \anchor _todo000775 (user): split.
</dd> <dt>
\_setscope operations_research::MPSolverInterface Member \_internalref classoperations__research_1_1MPSolverInterface#ac11b5863b3866e251564de9a5dcfb92e "operations_research::MPSolverInterface::MPSolverInterface" (MPSolver *solver)</dt><dd> \anchor _todo000776 (user): Initialize objective value and bound to +/- inf (depending on
optimization direction).
</dd> <dt>
\_setscope operations_research::MPSolverInterface Member \_internalref classoperations__research_1_1MPSolverInterface#a3fd73560f782eaf5093a435c61783d09 "operations_research::MPSolverInterface::ResetExtractionInformation" ()</dt><dd> \anchor _todo000777 (user): remove this method.
</dd> <dt>
\_setscope operations_research::MPSolverInterface Member \_internalref classoperations__research_1_1MPSolverInterface#ad237855fa79fc36fbf9baedce589384c "operations_research::MPSolverInterface::SetCommonParameters" (const MPSolverParameters ¶m)</dt><dd> \anchor _todo000778 (user): Overhaul the code that sets parameters to enable changing
GLOP parameters without issuing warnings.
By default, we let GLOP keep its own default tolerance, much more accurate
than for the rest of the solvers.
<p> \anchor _todo000779 (user): In the future, we could distinguish between the
algorithm to solve the root LP and the algorithm to solve node
LPs. Not sure if underlying solvers support it.
</dd> <dt>
\_setscope operations_research::MPSReaderTemplate Member \_internalref classoperations__research_1_1MPSReaderTemplate#a869ef12982e257cfc432773dae4b3d6a "operations_research::MPSReaderTemplate< DataWrapper >::MPSReaderTemplate" ()</dt><dd> \anchor _todo000852 (user): Support 'SI' (semi integer).
</dd> <dt>
\_setscope operations_research::NearestNeighbors Member \_internalref classoperations__research_1_1NearestNeighbors#af61cd5ece87302a1054745def342cf71 "operations_research::NearestNeighbors::Initialize" ()</dt><dd> \anchor _todo000219 (user): recompute if node changes path ?
</dd> <dt>
\_setscope operations_research::ObjectiveMonitor Member \_internalref classoperations__research_1_1ObjectiveMonitor#abfce94c7e8c5e81991ad9d744ecf7f3e "operations_research::ObjectiveMonitor::ObjectiveMonitor" (Solver *solver, const std::vector< bool > &maximize, std::vector< IntVar * > vars, std::vector< int64_t > steps)</dt><dd> \anchor _todo000382 (user): Remove optimization direction from solver or expose it for
each OptimizeVar variable. Note that Solver::optimization_direction() is
not used anywhere, only passed as information for the user. Direction set
based on highest level as of 02/2023.
</dd> <dt>
\_setscope operations_research::Pack Member \_internalref classoperations__research_1_1Pack#af13898c8553d217fa3d52c6e2b504f8d "operations_research::Pack::OneDomain" (int var_index)</dt><dd> \anchor _todo000239 (user): We know var ranges from 0 to bins_. There are lots
of simplifications possible.
</dd> <dt>
\_setscope operations_research::PairExchangeOperator Member \_internalref classoperations__research_1_1PairExchangeOperator#abe5bdb5b47972a06326d2e9ab802faf4 "operations_research::PairExchangeOperator::MakeNeighbor" () override</dt><dd> \anchor _todo000337 (user): Support alternatives with neighbors.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ad269bb3141acc83c2ebe88b1f57b1f95 "operations_research::ParseAndSolve" (const std::string &filename, absl::string_view solver, const std::string ¶ms)</dt><dd> \anchor _todo000998 (user): Move naming code to parser.
</dd> <dt>
\_setscope operations_research::PathContainerImpl Class \_internalref classoperations__research_1_1PathContainerImpl "operations_research::PathContainerImpl" </dt><dd> \anchor _todo000708 (user): Currently using StarGraph::kNilNode until the new Ebert
graphs appear; switch to kNilNode on the base Ebert graph class when
available.
</dd> <dt>
\_setscope operations_research::PathLns Member \_internalref classoperations__research_1_1PathLns#a869e1cdf41f26c362721696997202bf7 "operations_research::PathLns::MakeNeighbor" () override</dt><dd> \anchor _todo000220 (user): make this more efficient.
</dd> <dt>
\_setscope operations_research::PathOperator Member \_internalref classoperations__research_1_1PathOperator#adbd9065c5b91dde20b8f4c0759233971 "operations_research::PathOperator::OnSamePathAsPreviousBase" (int64_t base_index)</dt><dd> \anchor _todo000156 (user): ideally this should be OnSamePath(int64_t node1, int64_t
node2);
it's currently way more complicated to implement.
</dd> <dt>
\_setscope operations_research::PathOperator Member \_internalref classoperations__research_1_1PathOperator#a6580d6cdf003656019a25f7e9f2d8496 "operations_research::PathOperator::RestartAtPathStartOnSynchronize" ()</dt><dd> \anchor _todo000155 (user): remove this when automatic detection of such cases in done.
</dd> <dt>
\_setscope operations_research::PathOperator Member \_internalref classoperations__research_1_1PathOperator#a13fc3f3cb8f8de7198d1b16338df06ad "operations_research::PathOperator::SkipUnchanged" (int index) const override</dt><dd> \anchor _todo000154 (user): Make the following methods protected.
</dd> <dt>
\_setscope operations_research::pdlp Member \_internalref namespaceoperations__research_1_1pdlp#a7bd16384c5572b001a57e9987bf5b0e9 "operations_research::pdlp::FindScalingFactor" (const DiagonalTrustRegionProblem &problem, const Sharder &sharder, const double target_radius, const double solve_tol)</dt><dd> \anchor _todo001017 (user): figure out what accuracy is useful to callers and redo the
stopping criterion accordingly.
</dd> <dt>
\_setscope operations_research::pdlp::internal Member \_internalref namespaceoperations__research_1_1pdlp_1_1internal#a0d1a488cd88b2db320196184c8a60713 "operations_research::pdlp::internal::ComputeInitialUndecidedComponents" (const TrustRegionProblem &problem, int64_t start_index, int64_t end_index, std::vector< int64_t > &undecided_components)</dt><dd> \anchor _todo001018 (user): Evaluate dropping this <tt>reserve()</tt>, since it wastes space
if many components are decided.
</dd> <dt>
\_setscope operations_research::pdlp Member \_internalref namespaceoperations__research_1_1pdlp#a898c0c776a5736cf1931036d0d370724 "operations_research::pdlp::ProjectToDualVariableBounds" (const ShardedQuadraticProgram &sharded_qp, VectorXd &dual)</dt><dd> \anchor _todo001014 (user): Investigate whether it is more efficient to
use .cwiseMax() + .cwiseMin() with unaryExpr(s) that map
upper_bound_shard and lower_bound_shard to appropriate values.
</dd> <dt>
\_setscope operations_research::pdlp Member \_internalref namespaceoperations__research_1_1pdlp#a80b7dc41ed788020cbaf942674f623d9 "operations_research::pdlp::ReadQuadraticProgramOrDie" (const std::string &filename, bool include_names)</dt><dd> \anchor _todo001012 (user): Update internal helper functions to use references instead of
pointers.
</dd> <dt>
\_setscope operations_research::pdlp::ShardedWeightedAverage Member \_internalref classoperations__research_1_1pdlp_1_1ShardedWeightedAverage#a832ecd48fecace426aeb1c32f0322fbb "operations_research::pdlp::ShardedWeightedAverage::ComputeAverage" () const</dt><dd> \anchor _todo001013 (user): consider returning a reference to avoid this copy.
</dd> <dt>
\_setscope operations_research::PdlpInterface Member \_internalref classoperations__research_1_1PdlpInterface#aeba91f0ed5437b1264431fc6562ff094 "operations_research::PdlpInterface::column_status" (int variable_index) const override</dt><dd> \anchor _todo000786 (user): While basis status isn't well defined for PDLP, we could
guess statuses that might be useful.
</dd> <dt>
\_setscope operations_research::PdlpInterface Member \_internalref classoperations__research_1_1PdlpInterface#aecba606519ca8ae9dfb6493a4653cbfc "operations_research::PdlpInterface::row_status" (int constraint_index) const override</dt><dd> \anchor _todo000785 (user): While basis status isn't well defined for PDLP, we could
guess statuses that might be useful.
</dd> <dt>
\_setscope operations_research::PdlpInterface Member \_internalref classoperations__research_1_1PdlpInterface#a22fcf7b9b53475d97d46e1eb057d1b87 "operations_research::PdlpInterface::underlying_solver" () override</dt><dd> \anchor _todo000787 (user): Consider returning the SolveLog here, as it could be essential
for interpreting the PDLP solution.
</dd> <dt>
\_setscope operations_research::PiecewiseLinearExpr Member \_internalref classoperations__research_1_1PiecewiseLinearExpr#a29f2fd207e34ba398b1b772d21852f33 "operations_research::PiecewiseLinearExpr::Accept" (ModelVisitor *const visitor) const override</dt><dd> \anchor _todo000199 (user): Implement visitor.
</dd> <dt>
\_setscope operations_research::PiecewiseLinearFunction Member \_internalref classoperations__research_1_1PiecewiseLinearFunction#adb77fb211d172324d3d02e974af56c5b "operations_research::PiecewiseLinearFunction::Value" (int64_t x) const</dt><dd> \anchor _todo002379 (user): Allow the user to specify the
undefined value and use kint64max as the default.
</dd> <dt>
\_setscope operations_research::PruningHamiltonianSolver Member \_internalref classoperations__research_1_1PruningHamiltonianSolver#aee868e1ea38d845f3da2cb0d38ad6d3f "operations_research::PruningHamiltonianSolver< CostType, CostFunction >::Integer" </dt><dd> \anchor _todo000647 (user): Use generic map-based cache instead of lattice-based one.
<p> <p>(user): Use SaturatedArithmetic for better precision.
</dd> <dt>
\_setscope operations_research::Queue Member \_internalref classoperations__research_1_1Queue#a014c7261e4c1b40cd8d81d22e22c3e94 "operations_research::Queue::ProcessConstraints" ()</dt><dd> \anchor _todo000129 (user): Add profiling to initial propagation
<p> \anchor _todo000128 (user): Make to_add_ a queue to make the behavior more obvious.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ad9e6cb141794cea6160e283e70c283c7 "operations_research::RadixSort" (absl::Span< T > values)</dt><dd> \anchor _todo000040 (user): Expose an API that takes the "max value" as argument, for
users who want to take advantage of that knowledge to reduce the number of
passes.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ab5ef2e157c0cb5fad29b2b6db644f8a0 "operations_research::RadixSortTpl" (absl::Span< T > values)</dt><dd> \anchor _todo000039 (user): See if memcpy everything + memcpy here is faster than
memmove().
<p> \anchor _todo000037 : remove the if constexpr so that compilation catches the bad cases.
<p> \anchor _todo000038 (user): See if this is faster than memcpy + std::reverse().
</dd> <dt>
\_setscope operations_research::RandomSolutionGenerator Class \_internalref classoperations__research_1_1RandomSolutionGenerator "operations_research::RandomSolutionGenerator" </dt><dd> \anchor _todo000045 (user): make it possible to use other random generators. Idea: bias the
generator towards the columns with the least marginal costs.
</dd> <dt>
\_setscope operations_research::RangeIntToIntFunction Member \_internalref classoperations__research_1_1RangeIntToIntFunction#a95dc968eea4874e0099cc74f38bd4aca "operations_research::RangeIntToIntFunction::Query" (int64_t argument) const =0</dt><dd> \anchor _todo002381 (user): Rename to Run
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a9dc92cf61d5051e6ec16fa5dc7e371ae "operations_research::RationalApproximation" (const double x, const double precision)</dt><dd> \anchor _todo002382 (user): make a parameterized template with integer and floating-point
type parameters.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a02563c6a9501a9306b8a52fd459b7e8c "operations_research::ReadBeasleySetCoverProblem" (absl::string_view filename)</dt><dd> \anchor _todo000058 (user): add proper error handling.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a69a780b033f05ccd016fa3ce547f90f5 "operations_research::ReadQapProblemOrDie" (const std::string &filepath)</dt><dd> \anchor _todo002380 (user): Unit test cases when the function dies, or return
(and test) a status instead.
</dd> <dt>
\_setscope operations_research::RelocateAndMakeActiveOperator Class \_internalref classoperations__research_1_1RelocateAndMakeActiveOperator "operations_research::RelocateAndMakeActiveOperator" </dt><dd> \anchor _todo000218 (user): Naming is close to MakeActiveAndRelocate but this one is
correct; rename MakeActiveAndRelocate if it is actually used.
</dd> <dt>
\_setscope operations_research::RevBitMatrix Member \_internalref classoperations__research_1_1RevBitMatrix#ae2bcb32bc27553f598733168bbc46fd2 "operations_research::RevBitMatrix::IsCardinalityOne" (int row) const</dt><dd> \anchor _todo000397 (user) : Optimize this one.
</dd> <dt>
\_setscope operations_research::RevVector Member \_internalref classoperations__research_1_1RevVector#a576b88e9d92029753f73f012e2b57599 "operations_research::RevVector< IndexType, T >::MutableRef" (IndexType index)</dt><dd> \anchor _todo002384 (user): Maybe we could have also used the [] operator, but it is harder
to be 100% sure that the mutable version is only called when we modify
the vector. And I had performance bug because of that.
</dd> <dt>
\_setscope operations_research::RoutingFilteredHeuristic Member \_internalref classoperations__research_1_1RoutingFilteredHeuristic#a7bb79a29267b7b9153447234897a7949 "operations_research::RoutingFilteredHeuristic::MakeUnassignedNodesUnperformed" ()</dt><dd> \anchor _todo000352 (user): check that delta_ is empty.
</dd> <dt>
\_setscope operations_research::RoutingGlopWrapper Member \_internalref classoperations__research_1_1RoutingGlopWrapper#a6e9afdf1ffb0dba256ae65a29dcc3e64 "operations_research::RoutingGlopWrapper::PrintModel" () const override</dt><dd> \anchor _todo000333 (user): Improve output readability.
</dd> <dt>
\_setscope operations_research::RoutingGlopWrapper Member \_internalref classoperations__research_1_1RoutingGlopWrapper#ae230124d932c4d9f0da5d5b9538b88ba "operations_research::RoutingGlopWrapper::SetVariableDisjointBounds" (int index, const std::vector< int64_t > &starts, const std::vector< int64_t > &ends) override</dt><dd> \anchor _todo000332 (user): Investigate if we can avoid rebuilding the interval list
each time (we could keep a reference to the forbidden interval list in
RoutingDimension but we would need to store cumul offsets and use them
when checking intervals).
</dd> <dt>
\_setscope operations_research::RoutingIndexManager Member \_internalref classoperations__research_1_1RoutingIndexManager#a148a071cb5a92fe73501c7c299ed5eb1 "operations_research::RoutingIndexManager::num_unique_depots" () const</dt><dd> \anchor _todo000322 (user) Add unit tests for NodesToIndices and IndicesToNodes.
<p> <p>(user): Remove when removal of NodeIndex from RoutingModel is
complete.
</dd> <dt>
\_setscope operations_research::RoutingModelInspector Member \_internalref classoperations__research_1_1RoutingModelInspector#a84dbe032f5cce5e2e3acc042382b1f85 "operations_research::RoutingModelInspector::EndVisitModel" (const std::string &) override</dt><dd> \anchor _todo000288 (user): Perform transitive closure of dimension precedence graphs.
<p> \anchor _todo000289 <p> \anchor _todo000290 (user): Have a single annotated precedence graph.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#aac65f6cb5816150efa463314f16ee1cd "operations_research::RunSeparation" (internal::ScipCallbackRunner *runner, const ScipConstraintHandlerContext &context, absl::Span< SCIP_CONS * > constraints, bool is_integral)</dt><dd> \anchor _todo000801 (user): when infeasible is true, it better to have the scip
return status be cutoff instead of cutting plane added (e.g. see
cs/scip/src/scip/cons_knapsack.c). However, as we use
SCIPaddRow(), it isn't clear this will even happen.
<p> \anchor _todo000802 (user): Maybe it is better to expose more of these options,
potentially through user_suggested_constraint.
</dd> <dt>
\_setscope operations_research::sat::ActivityBoundHelper Class \_internalref classoperations__research_1_1sat_1_1ActivityBoundHelper "operations_research::sat::ActivityBoundHelper" </dt><dd> \anchor _todo002083 (user): Use better algorithm. The problem is the same as finding upper
bound to the classic problem: maximum-independent set in a graph. We also
only use at most ones, but we could use the more general binary implication
graph.
</dd> <dt>
\_setscope operations_research::sat::ActivityBoundHelper Member \_internalref classoperations__research_1_1sat_1_1ActivityBoundHelper#a0597d8e2ff729931de6b9e1e7df34298 "operations_research::sat::ActivityBoundHelper::AddAllAtMostOnes" (const CpModelProto &proto)</dt><dd> \anchor _todo002078 (user): Add long ones first, or at least the ones of size 2 after.
</dd> <dt>
\_setscope operations_research::sat::ActivityBoundHelper Member \_internalref classoperations__research_1_1sat_1_1ActivityBoundHelper#a7569741972c7325665407db889dc36af "operations_research::sat::ActivityBoundHelper::ComputeMaxActivity" (absl::Span< const std::pair< int, int64_t > > terms, std::vector< std::array< int64_t, 2 > > *conditional=nullptr)</dt><dd> \anchor _todo002086 (user): Indicate when the bounds are trivial (i.e. not intersection
with any amo) so that we don't waste more time processing the result?
</dd> <dt>
\_setscope operations_research::sat::ActivityBoundHelper Member \_internalref classoperations__research_1_1sat_1_1ActivityBoundHelper#ad71179e60a9659f4899d68ad8472b679 "operations_research::sat::ActivityBoundHelper::PresolveEnforcement" (absl::Span< const int > refs, ConstraintProto *ct, absl::flat_hash_set< int > *literals_at_true)</dt><dd> \anchor _todo002080 (user): Ideally these amo should not be added to this class.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a799cf49d8b3bb7f3ede756a639e6662c "operations_research::sat::AddCumulativeRelaxation" (const AffineExpression &capacity, SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands, const std::optional< AffineExpression > &makespan, Model *model, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001902 (user): We could use (capacity / demands_gcd) * demands_gcd.
<p> \anchor _todo001904 (user): In some cases, we could have only one task that can be
first.
<p> \anchor _todo001903 (user): Implement demands_gcd != 1 && capacity is fixed.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a9ab304db27f5c4170f35583c69269394 "operations_research::sat::AddDisjunctive" (const std::vector< IntervalVariable > &intervals, Model *model)</dt><dd> \anchor _todo001606 (user): This is not completely true for empty intervals (start == end).
Make sure such intervals are ignored by the constraint.
<p> \anchor _todo001588 (user): create them dynamically instead?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#abf0e8ef0b1ad01ad3a9aae0a009e5f13 "operations_research::sat::AddLinMaxCutGenerator" (const ConstraintProto &ct, Model *m, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001914 (user): Move this out of here.<p> \anchor _todo001913 (user): Support linearization of general target expression.
</dd> <dt>
\_setscope operations_research::sat::AffineExpression Member \_internalref structoperations__research_1_1sat_1_1AffineExpression#ae2df741604041f566520f58d28482eef "operations_research::sat::AffineExpression::var" </dt><dd> \anchor _todo001686 (user): Make this private to enforce the invariant that coeff cannot be
negative.
</dd> <dt>
\_setscope operations_research::sat::AllDifferentBoundsPropagator Class \_internalref classoperations__research_1_1sat_1_1AllDifferentBoundsPropagator "operations_research::sat::AllDifferentBoundsPropagator" </dt><dd> \anchor _todo001029 (user): It might be difficult to find something faster than what is
implemented here. Some related reference:
https://cs.uwaterloo.ca/~vanbeek/Publications/ijcai03_TR.pdf
</dd> <dt>
\_setscope operations_research::sat::AllDifferentBoundsPropagator Member \_internalref classoperations__research_1_1sat_1_1AllDifferentBoundsPropagator#abcd3b5d1133bde855025a642745ca3b6 "operations_research::sat::AllDifferentBoundsPropagator::Propagate" () final</dt><dd> \anchor _todo001028 (user): investigate the impact.
</dd> <dt>
\_setscope operations_research::sat::AllDifferentConstraint Member \_internalref classoperations__research_1_1sat_1_1AllDifferentConstraint#a59e041a85cd31545fe5d7e0e3907d3a4 "operations_research::sat::AllDifferentConstraint::AllDifferentConstraint" (std::vector< IntegerVariable > variables, IntegerEncoder *encoder, Trail *trail, IntegerTrail *integer_trail)</dt><dd> \anchor _todo001026 (user): Prune now, ignore these variables during solving.
</dd> <dt>
\_setscope operations_research::sat::AllDifferentConstraint Member \_internalref classoperations__research_1_1sat_1_1AllDifferentConstraint#a1adb3a2f02ebc277b22879cd01e994b2 "operations_research::sat::AllDifferentConstraint::Propagate" () final</dt><dd> \anchor _todo001027 (user): If needed, there are several ways performance could be
improved.
If copying the variable state is too costly, it could be maintained instead.
If the propagator has too many fruitless calls (without failing/pruning),
we can remember the O(n) arcs used in the matching and the SCC decomposition,
and guard calls to Propagate() if these arcs are still valid.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#afc1129274beafb17b41ac2fa278de60c "operations_research::sat::AllValuesInDomain" (const ProtoWithDomain &proto)</dt><dd> \anchor _todo001493 (user): work directly on the Domain class instead.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a43f4e0c653d01e67ff65ec40eb96e2e5 "operations_research::sat::AnalyzeIntervals" (bool transpose, absl::Span< const int > local_boxes, absl::Span< const Rectangle > rectangles, absl::Span< const IntegerValue > rectangle_energies, IntegerValue *x_threshold, IntegerValue *y_threshold, Rectangle *conflict)</dt><dd> \anchor _todo001584 (user): If the number of unique x_max is smaller than the number of
unique x_min, it is better to do it the other way around.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ac506719ca656893d93a2a6c940999265 "operations_research::sat::AppendBoolAndRelaxation" (const ConstraintProto &ct, Model *model, LinearRelaxation *relaxation, ActivityBoundHelper *activity_helper)</dt><dd> \anchor _todo001898 (user): More generally, do not miss the same structure if the bool_and
was expanded into many clauses!<p> \anchor _todo001899 (user): It is not 100% clear that just not adding one constraint is
worse. Relaxation is worse, but then we have less constraint.
<p> \anchor _todo001897 (user): These constraints can be many, and if they are not regrouped
in big at most ones, then they should probably only added lazily as cuts.
Regroup this with future clique-cut separation logic.</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a99c02b5f23ff755783f84c851f8dcbb2 "operations_research::sat::AppendElementEncodingRelaxation" (Model *m, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001915 (user): We can do something similar with just an at most one, however
it is harder to detect that if all literal are false then none of the implied
value can be taken.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a42d3ac4927f1adbca821091239fc06c7 "operations_research::sat::AppendLinearConstraintRelaxation" (const ConstraintProto &ct, bool linearize_enforced_constraints, Model *model, LinearRelaxation *relaxation, ActivityBoundHelper *activity_helper)</dt><dd> \anchor _todo001907 (user): In LoadLinearConstraint() we already created intermediate
Booleans for each disjoint interval, we should reuse them here if
possible.<p> \anchor _todo001908 (user): process the "at most one" part of a == 1 separately?
<p> \anchor _todo001909 (user): Use cleaner "already loaded" logic, and mark as such constraint
already encoded by code like AppendRelaxationForEqualityEncoding().
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a87160f650c0f35013f055fb81b3dfd30 "operations_research::sat::AppendLinMaxRelaxationPart1" (const ConstraintProto &ct, Model *model, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001923 (user): Support linear expression as target.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aab775ea3151335d5d07e4071e38a4687 "operations_research::sat::AppendLinMaxRelaxationPart2" (IntegerVariable target, const std::vector< Literal > &alternative_literals, const std::vector< LinearExpression > &exprs, Model *model, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001906 (user): Remove hash_map ?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a9d126152f7618c43746d3f56577b803e "operations_research::sat::AppendMaxAffineRelaxation" (const ConstraintProto &ct, Model *model, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001905 (user): experiment with:
1) remove this code
2) keep this code
3) remove this code and create the cut generator at level 1.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#af8a1aaff5bb36f1dfaf3daea8d5a076e "operations_research::sat::AppendRelaxationForEqualityEncoding" (IntegerVariable var, const Model &model, LinearRelaxation *relaxation, int *num_tight, int *num_loose)</dt><dd> \anchor _todo001896 (user): PartialDomainEncoding() filter pair corresponding to literal
set to false, however the initial variable Domain is not always updated. As
a result, these min/max can be larger than in reality. Try to fix this even
if in practice this is a rare occurrence, as the presolve should have
propagated most of what we can.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#abd42a035a99f910066d0a0356eff9ed6 "operations_research::sat::AppendSquareRelaxation" (const ConstraintProto &ct, Model *m, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001912 (user): We could add all or some below_hyperplans.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ab3f18aece2e354382532b24b02e0ca81 "operations_research::sat::ApplyLiteralMappingToBooleanProblem" (const absl::StrongVector< LiteralIndex, LiteralIndex > &mapping, LinearBooleanProblem *problem)</dt><dd> \anchor _todo001037 (user): The names is currently all scrambled. Do something about it
so that non-fixed variables keep their names.
</dd> <dt>
\_setscope operations_research::sat::ArcGraphNeighborhoodGenerator Member \_internalref classoperations__research_1_1sat_1_1ArcGraphNeighborhoodGenerator#a23331202e80d1f0b6439fac92b7e2e92 "operations_research::sat::ArcGraphNeighborhoodGenerator::Generate" (const CpSolverResponse &initial_solution, double difficulty, absl::BitGenRef random) final</dt><dd> \anchor _todo001150 (user): should we compress it or use a different representation ?
</dd> <dt>
\_setscope operations_research::sat::AssignmentInfo Member \_internalref structoperations__research_1_1sat_1_1AssignmentInfo#a2c118b72a43ea721d8c724184e7c54f6 "operations_research::sat::AssignmentInfo::level" </dt><dd> \anchor _todo002126 (user): We currently don't support more than 2^28 decision levels. That
should be enough for most practical problem, but we should fail properly if
this limit is reached.
<p> \anchor _todo002125 (user): We may be able to get rid of that for faster enqueues. Most of
the code only need to know if this is 0 or the highest level, and for the
LBD computation, the literal of the conflict are already ordered by level,
so we could do it fairly efficiently.</dd> <dt>
\_setscope operations_research::sat::BasicKnapsackSolver Member \_internalref classoperations__research_1_1sat_1_1BasicKnapsackSolver#abf8b154951fbb851e98a619ff969b0ef "operations_research::sat::BasicKnapsackSolver::Solve" (const std::vector< Domain > &domains, const std::vector< int64_t > &coeffs, const std::vector< int64_t > &costs, const Domain &rhs)</dt><dd> \anchor _todo002324 (user): We can also solve efficiently if max_activity - rhs.Min() is
small. Implement.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ae35ceb34b6366add1981140f6a173339 "operations_research::sat::BasicOrbitopeExtraction" (absl::Span< const std::unique_ptr< SparsePermutation > > generators)</dt><dd> \anchor _todo002287 (user): Detect more than one orbitope? Note that once detected, the
structure can be exploited efficiently, but for now, a more "generic"
algorithm based on stabilizator should achieve the same preprocessing power,
so I don't know how hard we need to invest in orbitope detection.<p> \anchor _todo002286 (user): We could grow each and keep the real maximum.
<p> \anchor _todo002288 (user): The heuristic is quite limited for now, but this works on
graph20-20-1rand.mps.gz. I suspect the generators provided by the detection
code follow our preconditions.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Class \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph "operations_research::sat::BinaryImplicationGraph" </dt><dd> \anchor _todo001077 (user): Most of the note below are done, but we currently only applies
the reduction before the solve. We should consider doing more in-processing.
The code could probably still be improved too.</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#ae18864358e7e3f0d4c9c7cf81e3757de "operations_research::sat::BinaryImplicationGraph::AddAtMostOne" (absl::Span< const Literal > at_most_one)</dt><dd> \anchor _todo001081 (user): Our algorithm could generalize easily to at_most_ones + a list
of literals that will be false if one of the literal in the amo is at one.
It is a way to merge common list of implications.</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#a76cf257e080c0b1fa5fd4b76f908e51c "operations_research::sat::BinaryImplicationGraph::AddBinaryClause" (Literal a, Literal b)</dt><dd> \anchor _todo001054 (user): Not all of the solver knows about representative literal, do
use them here to maintains invariant? Explore this when we start cleaning our
clauses using equivalence during search. We can easily do it for every
conflict we learn instead of here.
<p> \anchor _todo001055 (user): Like this we will duplicate all binary clause from the
problem. However this leads to a simpler API (since we don't need to
special case the loading of the original clauses) and we mainly use drat
proof for testing anyway.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#a07e88e219614208bf02f4bed078504f9 "operations_research::sat::BinaryImplicationGraph::ComputeTransitiveReduction" (bool log_info=false)</dt><dd> \anchor _todo001065 (user): Track which literal have new implications, and only process
the antecedants of these.
<p> \anchor _todo001066 (user): the situation with fixed variable is not really "clean".
Simplify the code so we are sure we don't run into issue or have to deal
with any of that here.
<p> \anchor _todo001069 (user): Another optim we can do is that we never need to expand
any node with a reverse topo order smaller or equal to the min of the
ones in this list.
<p> \anchor _todo001067 (user): We should be able to reuse some propagation like it is done for
tree-look. Once a node is processed, we just need to process a node that
implies it. Test if we can make this faster. Alternatively, only clear
a part of is_marked_ (after the first child of root in reverse topo order).<p> \anchor _todo001068 (user): Can we exploit the fact that the implication graph is a
skew-symmetric graph (isomorphic to its transposed) so that we do less
work?
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#aa80bafd5aaf59cc6c7a67176c6304239 "operations_research::sat::BinaryImplicationGraph::DetectEquivalences" (bool log_info=false)</dt><dd> \anchor _todo001064 (user): We could just do it directly though.
<p> \anchor _todo001082 (user): Completely get rid of such literal instead? it might not be
reasonable code-wise to remap our literals in all of our constraints
though.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#ab589014979b15460c0cb295527097731 "operations_research::sat::BinaryImplicationGraph::DirectImplications" (Literal literal)</dt><dd> \anchor _todo001075 (user): lazy cleanup the lists on is_removed_?
<p> <p>(user): Mark fixed variable as is_removed_ for faster iteration?
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#af82f4ac499358536858b414345c0b13e "operations_research::sat::BinaryImplicationGraph::EnableSharing" (bool enable)</dt><dd> \anchor _todo001080 (user): this is meant to share clause between workers, hopefully the
contention will not be too high. Double check and maybe add a batch version
were we keep new implication and add them in batches.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#a2735353cc3b14a2ef6574ad9f52c06b7 "operations_research::sat::BinaryImplicationGraph::ExtractAllBinaryClauses" (Output *out) const</dt><dd> \anchor _todo001086 (user): Ideally we should just never have duplicate clauses in this
class. But it seems we do in some corner cases, so lets not output them
twice.
<p> \anchor _todo001085 (user): When extracting to cp_model.proto we could be more efficient
by extracting bool_and constraint with many lhs terms.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#aba4f40564f3adae0c9b904663bf62637 "operations_research::sat::BinaryImplicationGraph::GenerateAtMostOnesWithLargeWeight" (const std::vector< Literal > &literals, const std::vector< double > &lp_values)</dt><dd> \anchor _todo001083 (user): Refine the heuristic and unit test!
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#af1d6fe0884e39f01edd6512ea6a7ce1c "operations_research::sat::BinaryImplicationGraph::HeuristicAmoPartition" (std::vector< Literal > *literals)</dt><dd> \anchor _todo001084 (user): Add a limit to make sure this do not take too much time.
<p> \anchor _todo001072 (user): Use deterministic limit.
<p> <p>(user): Explore the graph instead of just looking at full amo, especially
since we expand small ones.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#aa37e2a622549d733c3bbb8b340f3c473 "operations_research::sat::BinaryImplicationGraph::MinimizeConflictExperimental" (const Trail &trail, std::vector< Literal > *c)</dt><dd> \anchor _todo001061 (user): Also consider at most one?
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#ab5846564f39bf6ba28ecdced8429d492 "operations_research::sat::BinaryImplicationGraph::MinimizeConflictFirst" (const Trail &trail, std::vector< Literal > *c, SparseBitset< BooleanVariable > *marked)</dt><dd> \anchor _todo001060 (user): if this is false, then we actually have a conflict of size 2.
This can only happen if the binary clause was not propagated properly
if for instance we do chronological bactracking without re-enqueing the
consequence of a binary clause.
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#a3cbe67b46860621bfa57c87f5247a385 "operations_research::sat::BinaryImplicationGraph::MinimizeConflictWithReachability" (std::vector< Literal > *c)</dt><dd> \anchor _todo001059 (user): This sounds like a good idea, but somehow it seems better not
to do that even though it is almost for free. Investigate more.<p> \anchor _todo001058 (user): Also consider at most one?
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#a7e4e6130c59dffa6ab52a1cff24400a2 "operations_research::sat::BinaryImplicationGraph::RemoveFixedVariables" ()</dt><dd> \anchor _todo001063 (user): This might be a bit slow. Do not call all the time if needed,
this shouldn't change the correctness of the code.
<p> \anchor _todo001062 (user): This might not be true if we remove implication by
transitive reduction and the process was aborted due to the computation
limit. I think it will be good to maintain that invariant though,
otherwise fixed literals might never be removed from these lists...
</dd> <dt>
\_setscope operations_research::sat::BinaryImplicationGraph Member \_internalref classoperations__research_1_1sat_1_1BinaryImplicationGraph#a4a7ae378f427890ed11dfa8efb7c1db7 "operations_research::sat::BinaryImplicationGraph::TransformIntoMaxCliques" (std::vector< std::vector< Literal > > *at_most_ones, int64_t max_num_explored_nodes=1e8)</dt><dd> \anchor _todo001071 (user): Detect on the fly is superset already exist.
<p> \anchor _todo001070 (user): Shall we presolve it here?
</dd> <dt>
\_setscope operations_research::sat::BlockedClauseSimplifier Class \_internalref classoperations__research_1_1sat_1_1BlockedClauseSimplifier "operations_research::sat::BlockedClauseSimplifier" </dt><dd> \anchor _todo002195 (user): This requires that l only appear in clauses and not in the
integer part of CP-SAT.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#abf22a8b8635128f673b91dd5bc577544 "operations_research::sat::BooleanLinearConstraint" )(int64_t lower_bound, int64_t upper_bound, std::vector< LiteralWithCoeff > *cst)</dt><dd> \anchor _todo002236 (user): move them in another file, and unit-test them.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a937ae99fd6f6c445a8aad34f04222a1a "operations_research::sat::BooleanLinearExpressionIsCanonical" (absl::Span< const LiteralWithCoeff > cst)</dt><dd> \anchor _todo001984 (user): Also check for no duplicates literals + unit tests.
</dd> <dt>
\_setscope operations_research::sat::BooleanOrIntegerVariable Struct \_internalref structoperations__research_1_1sat_1_1BooleanOrIntegerVariable "operations_research::sat::BooleanOrIntegerVariable" </dt><dd> \anchor _todo001764 (user): This is currently quadratic as we scan all variables to find the
first unassigned one. Fix. Note that this is also the case in many other
heuristics and should be fixed.
</dd> <dt>
\_setscope operations_research::sat::BooleanXorPropagator Class \_internalref classoperations__research_1_1sat_1_1BooleanXorPropagator "operations_research::sat::BooleanXorPropagator" </dt><dd> \anchor _todo001100 (user): By using a two watcher mechanism, we can propagate this a lot
faster.
</dd> <dt>
\_setscope operations_research::sat::BoolRLTCutHelper Member \_internalref classoperations__research_1_1sat_1_1BoolRLTCutHelper#a06106288eec90bbe9cf46ac3712de757 "operations_research::sat::BoolRLTCutHelper::TrySimpleSeparation" (const CutData &input_ct)</dt><dd> \anchor _todo001546 (user): Avoid constructing the cut just to evaluate its efficacy.
<p> \anchor _todo001542 (user): do less work, add more stats.
<p> \anchor _todo001543 (user): detect earlier that a factor is not worth checking because
we already loose too much with the DROP/MC_CORMICK cases ? Filter more ?
I think we can probably evaluate the factor efficiency during the first
loop which usually have a small complexity compared to num_factor_to_try
times num filtered terms.
<p> \anchor _todo001544 (user): we never use factor with lp value < 1e-4, but we could use a
factor equal to 1.0 I think. Double check.
<p> \anchor _todo001545 (user): We could keep for each factor the max gain, so that we
can decided if it is not even worth trying a factor.
</dd> <dt>
\_setscope operations_research::sat::BoundedVariableElimination Member \_internalref classoperations__research_1_1sat_1_1BoundedVariableElimination#a8d5a5e9f809d97c6dc3cbc5d948f4a51 "operations_research::sat::BoundedVariableElimination::DoOneRound" (bool log_info)</dt><dd> \anchor _todo002183 (user): we might also find new equivalent variable l => var => l
here, but for now we ignore those.
<p> \anchor _todo002182 (user): add a local dtime limit for the corner case where this take too
much time. We can adapt the limit depending on how much we want to spend on
inprocessing.
<p> \anchor _todo002181 (user): but we shouldn't keep clauses containing removed literals.
It is still valid to do so, but it should be less efficient.
</dd> <dt>
\_setscope operations_research::sat::CanonicalBooleanLinearProblem Class \_internalref classoperations__research_1_1sat_1_1CanonicalBooleanLinearProblem "operations_research::sat::CanonicalBooleanLinearProblem" </dt><dd> \anchor _todo001998 (user): Simplify further the constraints.<p> \anchor _todo001999 (user): Remove the duplication between this and what the sat solver
is doing in AddLinearConstraint() which is basically the same.<p> \anchor _todo002000 (user): Remove duplicate constraints? some problems have them, and
this is not ideal for the symmetry computation since it leads to a lot of
symmetries of the associated graph that are not useful.
</dd> <dt>
\_setscope operations_research::sat::CanonicalBooleanLinearProblem Member \_internalref classoperations__research_1_1sat_1_1CanonicalBooleanLinearProblem#ad91fdf3c0b3d6b5f52ab35e1ea1cfd31 "operations_research::sat::CanonicalBooleanLinearProblem::AddLinearConstraint" (bool use_lower_bound, Coefficient lower_bound, bool use_upper_bound, Coefficient upper_bound, std::vector< LiteralWithCoeff > *cst)</dt><dd> \anchor _todo002002 (user): Use a return status to distinguish errors if needed.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a3f5064fe335d0bd2f67a8c9e3e132b4f "operations_research::sat::CeilSquareRoot" (int64_t a)</dt><dd> \anchor _todo002323 (user): Find better implementation?
</dd> <dt>
\_setscope operations_research::sat::CircuitCoveringPropagator Class \_internalref classoperations__research_1_1sat_1_1CircuitCoveringPropagator "operations_research::sat::CircuitCoveringPropagator" </dt><dd> \anchor _todo001046 (user): Make distinguished nodes an array of Boolean variables,
so this can be used for facility location problems.
</dd> <dt>
\_setscope operations_research::sat::CircuitPropagator Member \_internalref classoperations__research_1_1sat_1_1CircuitPropagator#a54823f9c1557fcb9ee85d3c28c329bf0 "operations_research::sat::CircuitPropagator::Propagate" () final</dt><dd> \anchor _todo001041 (user): we can fail early in more case, like no more possible path
to any of the mandatory node.
<p> \anchor _todo001040 (user): both this and the loop on must_be_in_cycle_ might take some
time on large graph. Optimize if this become an issue.
</dd> <dt>
\_setscope operations_research::sat::CircuitPropagator Member \_internalref classoperations__research_1_1sat_1_1CircuitPropagator#a05dbff53ce702fea3c1b8dbd913a3228 "operations_research::sat::CircuitPropagator::RegisterWith" (GenericLiteralWatcher *watcher)</dt><dd> \anchor _todo001039 (user): come up with a test that fail when this is not here.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a445ddafc05cd8e1a75db81c1c4426179 "operations_research::sat::ClauseIsEnforcementImpliesLiteral" (absl::Span< const int > clause, absl::Span< const int > enforcement, int literal)</dt><dd> \anchor _todo002084 (user): For the same complexity, we do not need to specify literal and
can recover it.
</dd> <dt>
\_setscope operations_research::sat::ClauseManager Member \_internalref classoperations__research_1_1sat_1_1ClauseManager#a65d15a1a1d08387cb9f9e58e0e153540 "operations_research::sat::ClauseManager::DeleteRemovedClauses" ()</dt><dd> \anchor _todo001053 (user): If more indices are needed, generalize the code to a vector of
indices.
</dd> <dt>
\_setscope operations_research::sat::ClauseManager Member \_internalref classoperations__research_1_1sat_1_1ClauseManager#a4bb2615bf56f39aa7a070d8f4b2b8d03 "operations_research::sat::ClauseManager::Detach" (SatClause *clause)</dt><dd> \anchor _todo001078 (user): It might be better to have a "slower" mode in
PropagateOnFalse() that deal with detached clauses in the watcher list and
is activated until the next CleanUpWatchers() calls.
</dd> <dt>
\_setscope operations_research::sat::ClauseManager Member \_internalref classoperations__research_1_1sat_1_1ClauseManager#a00f87aaf6e3bf62d2de2f2c21f3f9d0b "operations_research::sat::ClauseManager::InprocessingAddClause" (absl::Span< const Literal > new_clause)</dt><dd> \anchor _todo001052 (user): We should return false...
</dd> <dt>
\_setscope operations_research::sat::ClauseManager Member \_internalref classoperations__research_1_1sat_1_1ClauseManager#ad50ac50e7697b1f7dbbaa750fd94cffa "operations_research::sat::ClauseManager::InprocessingFixLiteral" (Literal true_literal)</dt><dd> \anchor _todo001050 (user): remove the test when the DRAT issue with fixed literal is
resolved.
</dd> <dt>
\_setscope operations_research::sat::ClauseManager Member \_internalref classoperations__research_1_1sat_1_1ClauseManager#a19e5abfaaedf626fcfd0d44dd827fc24 "operations_research::sat::ClauseManager::InprocessingRemoveClause" (SatClause *clause)</dt><dd> \anchor _todo001051 (user): We could do something slower if the clauses are attached like
we do for InprocessingRewriteClause().
</dd> <dt>
\_setscope operations_research::sat::ClauseManager Member \_internalref classoperations__research_1_1sat_1_1ClauseManager#a2615c732b9c2b3c898f353fd68892c38 "operations_research::sat::ClauseManager::NextClauseToMinimize" ()</dt><dd> \anchor _todo001079 (user): If more indices are needed, switch to a generic API.
</dd> <dt>
\_setscope operations_research::sat::CombinedDisjunctive Member \_internalref classoperations__research_1_1sat_1_1CombinedDisjunctive#ac88bd295048bf30b8726c9f600587287 "operations_research::sat::CombinedDisjunctive< time_direction >::Propagate" () final</dt><dd> \anchor _todo001590 (user): AddEntry() and ComputeEndMin() could be combined.
<p> \anchor _todo001591 (user): Maybe factor out the code? It does require a function with a
lot of arguments though.
<p> \anchor _todo001592 (user): Refactor the code to use the same algo as in
DisjunctiveDetectablePrecedences, it is superior and do not need
this function.
</dd> <dt>
\_setscope operations_research::sat::CompiledConstraint Class \_internalref classoperations__research_1_1sat_1_1CompiledConstraint "operations_research::sat::CompiledConstraint" </dt><dd> \anchor _todo001095 (user): Do we add a Update(solution, var, new_value) method ?
<p> <p>(user): Do we want to support Update(solutions, vars, new_values) ?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a34cc8829256ea003a3f538b06d3a3a74 "operations_research::sat::ComputeLinearRelaxation" (const CpModelProto &model_proto, Model *m)</dt><dd> \anchor _todo001919 (user): compute connected components of the original problem and
split these cuts accordingly.
<p> \anchor _todo001918 (user): I am not sure this is still needed. Investigate and explain why
or remove.
<p> \anchor _todo001917 (user): This is similar to AppendRelaxationForEqualityEncoding() above.
Investigate if we can merge the code.
<p> \anchor _todo001916 (user): Should we add them to the LP anyway? this isn't clear as
we can sometimes create a lot of Booleans like this.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ac47959359a009b02531ab19f206cdd54 "operations_research::sat::ComputeTrueObjectiveLowerBound" (const CpModelProto &model_proto_with_floating_point_objective, const CpObjectiveProto &integer_objective, const int64_t inner_integer_objective_lower_bound)</dt><dd> \anchor _todo001937 (user): Code a custom algo with more precision guarantee?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a08ac4c44a4524b21806a1ae9839bc5bd "operations_research::sat::ConfigureSearchHeuristics" (Model *model)</dt><dd> \anchor _todo001751 (user): We might want to restart if external info is available.
Code a custom restart for this?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a807f0da8a99a471e809213176132588f "operations_research::sat::ConstructHeuristicSearchStrategy" (const CpModelProto &cp_model_proto, Model *model)</dt><dd> \anchor _todo001388 (user): Implement a routing search.
<p> \anchor _todo001389 (user): Alternatively, support creation of SatPropagator at positive
level.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a92a908deada7d4dc2b1d0dbfb427e040 "operations_research::sat::ConstructIntegerCompletionSearchStrategy" (const std::vector< IntegerVariable > &variable_mapping, IntegerVariable objective_var, Model *model)</dt><dd> \anchor _todo001390 (user): we could also fix terms of the objective in the right
direction.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ab621abdbab919d365ca747aebdd2ff74 "operations_research::sat::ConstructUserSearchStrategy" (const CpModelProto &cp_model_proto, Model *model)</dt><dd> \anchor _todo001387 (user): Improve the complexity if this becomes an issue which
may be the case if we do a fixed_search.
</dd> <dt>
\_setscope operations_research::sat::ContinuousProber Member \_internalref classoperations__research_1_1sat_1_1ContinuousProber#a1e83f97c78745b456678edb911c2147c "operations_research::sat::ContinuousProber::ContinuousProber" (const CpModelProto &model_proto, Model *model)</dt><dd> \anchor _todo001760 (user): Ideally, we should scan the internal model. But there can be
a large blowup of variables during loading, which slows down the probing
part. Using model variables is a good heuristic to select 'impactful'
Boolean variables.
</dd> <dt>
\_setscope operations_research::sat::ContinuousProber Member \_internalref classoperations__research_1_1sat_1_1ContinuousProber#a1de4d4b22a2717e58b2444683a806d22 "operations_research::sat::ContinuousProber::Probe" ()</dt><dd> \anchor _todo001762 (user): Probe optional variables.
<p> \anchor _todo001761 (user):
- sort variables before the iteration (statically or dynamically)
- compress clause databases regularly (especially the implication graph)
- better interleaving of the probing and shaving phases
- move the shaving code directly in the probing class
- probe all variables and not just the model ones
<p> \anchor _todo001763 (user): Currently, the heuristics is that we alternate shaving and
not shaving, unless use_shaving_in_probing_search is false.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ac9c41d8a7687386839ef94182e3badb9 "operations_research::sat::ConvertCpModelProtoToMPModelProto" (const CpModelProto &input, MPModelProto *output)</dt><dd> \anchor _todo001929 (user): Support more constraints with enforcement.
<p> \anchor _todo001936 (user): This first version do not even handle basic Boolean constraint.
Support more constraints as needed.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2d32bfb7e130364f3dd94087b686b6f5 "operations_research::sat::ConvertMPModelProtoToCpModelProto" (const SatParameters ¶ms, const MPModelProto &mp_model, CpModelProto *cp_model, SolverLogger *logger)</dt><dd> \anchor _todo001928 (user): We could avoid these cases by shifting the domain of
all variables to contain zero. This should also lead to a better scaling,
but it has some complications with integer variables and require some
post-solve.
<p> \anchor _todo001927 (user): This could be made larger if needed, so be smarter if we have
MIP problem that we cannot "convert" because of this. Note however than we
cannot go that much further because we need to make sure we will not run
into overflow if we add a big linear combination of such variables. It
should always be possible for a user to scale its problem so that all
relevant quantities are a couple of millions. A LP/MIP solver have a
similar condition in disguise because problem with a difference of more
than 6 magnitudes between the variable values will likely run into numeric
trouble.
</dd> <dt>
\_setscope operations_research::sat::CoreBasedOptimizer Member \_internalref classoperations__research_1_1sat_1_1CoreBasedOptimizer#ab0a342f8fad2c4262b0ddec85b98bdf8 "operations_research::sat::CoreBasedOptimizer::Optimize" ()</dt><dd> \anchor _todo001966 (user): It might be interesting to redo this kind of presolving
once high cost booleans have been fixed as we might have more at most
one between literal in the objective by then.<p> \anchor _todo001965 (user): Try to understand exactly why and merge both code path.
<p> \anchor _todo001973 (user): If the "search" is interrupted while computing cores, we
currently do not resume it flawlessly. We however add any cores we found
before aborting.
<p> \anchor _todo001967 (user): The core is returned in the same order as the assumptions,
so we don't really need this map, we could just do a linear scan to
recover which node are part of the core. This however needs to be properly
unit tested before usage.
<p> \anchor _todo001968 (user): This always resets the solver to level zero.
Because of that we don't resume a solve in "chunk" perfectly. Fix.
<p> \anchor _todo001969 (user): If the search is aborted during this phase and we solve in
"chunk", we don't resume perfectly from where it was. Fix.
<p> \anchor _todo001970 (user): These can be simply removed from the list.
<p> \anchor _todo001971 (user): we could keep an objective offset instead.
<p> \anchor _todo001979 (user): Change the algo slighlty to allow resuming from the last
aborted position. Currently, the search is "resumable", but it will restart
some of the work already done, so it might just never find anything.
<p> \anchor _todo001974 (user): Maybe the solver should do it right away.
<p> \anchor _todo001972 (user): We can probably be smarter about the cost of the
assumptions though.
</dd> <dt>
\_setscope operations_research::sat::CoreBasedOptimizer Member \_internalref classoperations__research_1_1sat_1_1CoreBasedOptimizer#a0484eb61f8e25adf3dbbcd05e39c7924 "operations_research::sat::CoreBasedOptimizer::OptimizeWithSatEncoding" (const std::vector< Literal > &literals, const std::vector< IntegerVariable > &vars, const std::vector< Coefficient > &coefficients, Coefficient offset)</dt><dd> \anchor _todo001980 (user):
- Support resuming for interleaved search.
- Implement all core heurisitics.
<p> \anchor _todo001958 (user): We could create EncodingNode out of IntegerVariable.<p> \anchor _todo001962 (user): With stratification, sometime we just spend too much time
trying to find a feasible solution/prove infeasibility and we could
instead just use stratification=0 to find easty core and improve lower
bound.
<p> \anchor _todo001961 (user): Find multiple core like in the "main" algorithm. This is just
trying to solve with assumptions not involving the newly found core.<p> \anchor _todo001960 (user): This might not be ideal if there are holes in the domain.
It should work by adding duplicates literal, but we should be able to
be more efficient.
<p> \anchor _todo001959 (user): It could still be beneficial to add one. Experiments.
</dd> <dt>
\_setscope operations_research::sat::CoverCutHelper Member \_internalref classoperations__research_1_1sat_1_1CoverCutHelper#a29be1489d397a5d646a838946a85a225 "operations_research::sat::CoverCutHelper::TrySimpleKnapsack" (const CutData &input_ct, ImpliedBoundsProcessor *ib_processor=nullptr)</dt><dd> \anchor _todo001530 (user): we don't have to pick max_coeff_in_cover and could use the
coefficient of the most fractional variable. Or like in the MIR code try
a few of them. Currently, the cut in the test is worse if we don't take
the max_coeff_in_cover though, so we need more understanding.<p> \anchor _todo001531 (user): It seems we could use a more advanced lifting function
described later in the paper. Investigate.
<p> \anchor _todo001532 (user): Experiment without this line that basically disable scoring.
<p> \anchor _todo001533 (user): experiment with different value of scaling and param t.
</dd> <dt>
\_setscope operations_research::sat::CoverCutHelper Member \_internalref classoperations__research_1_1sat_1_1CoverCutHelper#abf54256e1bd003c568c2efd55d75fdd6 "operations_research::sat::CoverCutHelper::TrySingleNodeFlow" (const CutData &input_ct, ImpliedBoundsProcessor *ib_processor=nullptr)</dt><dd> \anchor _todo001536 (user): If the Mir*() function is used, we don't need to extend that
much the period. Fix.
<p> \anchor _todo001534 (user): Change the heuristic to depends on the lp_value of the implied
bounds. This way we can exactly match what happen in FlowCoverCutHelper and
remove the code there.
<p> \anchor _todo001535 (user): Shouldn't we just use rounding f() with maximum coeff to allows
lift of all other terms? but then except for the heuristic the cut is
really similar to the cover cut.
<p> \anchor _todo001537 (user): do exact binary search to find highest x in
[-max_neg_magnitude, 0] such that f(x) == f(-max_neg_magnitude) ? not
really needed though since we know that we have this equality:
</dd> <dt>
\_setscope operations_research::sat::CoverCutHelper Member \_internalref classoperations__research_1_1sat_1_1CoverCutHelper#a82f509c2f8c4ea40561f572f6a612ebd "operations_research::sat::CoverCutHelper::TryWithLetchfordSouliLifting" (const CutData &input_ct, ImpliedBoundsProcessor *ib_processor=nullptr)</dt><dd> \anchor _todo001541 (user): For exact multiple of p/q we can increase the coeff by 1/2.
See section in the paper on getting maximal super additive function.
<p> \anchor _todo001540 (user): compute this in an overflow-safe way.
<p> \anchor _todo001538 (user): Merge Boolean terms that are complement of each other.
<p> \anchor _todo001539 (user): we currently only deal with Boolean in the cover. Fix.
<p> \anchor _todo001569 (user): Generalize to non-Boolean, or use a different cover heuristic
for this:
- We want a Boolean only cover currently.
- We can always use implied bound for this, since there is more chance
for a Bool only cover.
- Also, f() should be super additive on the value <= rhs, i.e. f(a + b) >=
f(a) + f(b), so it is always good to use implied bounds of the form X =
bound * B + Slack.
</dd> <dt>
\_setscope operations_research::sat::CpModelMapping Member \_internalref classoperations__research_1_1sat_1_1CpModelMapping#a58809f5b0a739fa62cf923b2ed919df5 "operations_research::sat::CpModelMapping::Affine" (const LinearExpressionProto &exp) const</dt><dd> \anchor _todo001190 (user): We could "easily" create an intermediate variable for more
complex linear expression. We could also identify duplicate expressions to
not create two identical integer variable.
</dd> <dt>
\_setscope operations_research::sat::CpModelPresolver Class \_internalref classoperations__research_1_1sat_1_1CpModelPresolver "operations_research::sat::CpModelPresolver" </dt><dd> \anchor _todo001380 (user): Identify disconnected components and returns a vector of
presolved model? If we go this route, it may be nicer to store the indices
inside the model. We can add a IntegerVariableProto::initial_index;
</dd> <dt>
\_setscope operations_research::sat::CpModelPresolver Member \_internalref classoperations__research_1_1sat_1_1CpModelPresolver#a4eea655cfbd484263d86d3d89af42bf5 "operations_research::sat::CpModelPresolver::Presolve" ()</dt><dd> \anchor _todo001366 (user): Make sure we can't have duplicate in these constraint.
These are due to ExpandCpModel() were we create such constraint with
duplicate. The problem is that some code assumes these are presolved
before being called.
<p> \anchor _todo001365 (user): The presolve transformations we do after this is called might
result in even more presolve if we were to call this again! improve the
code. See for instance plusexample_6_sat.fzn were represolving the
presolved problem reduces it even more.
<p> \anchor _todo001363 (user): move in the context.
<p> \anchor _todo001367 (user): Decide where is the best place for this.<p> \anchor _todo001368 (user): try not to break symmetry in our clique extension or other
more advanced presolve rule? Ideally we could even exploit them. But in
this case, it is still good to compute them early.
<p> \anchor _todo001364 (user): We should probably try to delay this even more. For that we
just need to isolate more the "dual" reduction that usually need to look at
the objective.
<p> \anchor _todo001369 (user): more generally if we do some probing, the same relation will
be detected (and more). Also add an option to turn this off?<p> \anchor _todo001373 (user): merge these code instead of doing many passes?
<p> \anchor _todo001372 <p> \anchor _todo001374 (user): try to be smarter and avoid looping again if little changed.
<p> \anchor _todo001371 (user): revisit when different transformation appear.
<p> \anchor _todo001370 (user): instead of extracting at most one, extract pairwise conflicts
and add them to bool_and clauses? this is some sort of small scale
probing, but good for sat presolve and clique later?
</dd> <dt>
\_setscope operations_research::sat::CpModelView Class \_internalref classoperations__research_1_1sat_1_1CpModelView "operations_research::sat::CpModelView" </dt><dd> \anchor _todo001402 (user): For now it uses proto indices of the loaded model. We will need
to add a mapping to use proto indices of the non-presolved model to allow for
a client custom search with presolve. The main API shouldn't change though
and the change will be transparent.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#af443c47f14a044d69553b02337b5dc52 "operations_research::sat::CpSolverResponseStats" (const CpSolverResponse &response, bool has_objective)</dt><dd> \anchor _todo001403 (user): This is probably better named "binary_propagation", but we just
output "propagations" to be consistent with sat/analyze.sh.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ae3fd4466b012022bab0c5c1839c77890 "operations_research::sat::CreateAlternativeLiteralsWithView" (int num_literals, Model *model, LinearRelaxation *relaxation)</dt><dd> \anchor _todo001900 (user): We shouldn't need to create this view ideally. Even better,
we should be able to handle Literal natively in the linear relaxation,
but that is a lot of work.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a55cafa81679ac10c971927ca17ec7f2e "operations_research::sat::CreateCumulativeEnergyCutGenerator" (SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands_helper, const AffineExpression &capacity, const std::optional< AffineExpression > &makespan, Model *model)</dt><dd> \anchor _todo002251 (user): use level 0 bounds ?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a88677d1180474733727feff2bbca0d31 "operations_research::sat::CreateFlowCutGenerator" (int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< AffineExpression > &arc_capacities, std::function< void(const std::vector< bool > &in_subset, IntegerValue *min_incoming_flow, IntegerValue *min_outgoing_flow)> get_flows, Model *model)</dt><dd> \anchor _todo002121 (user): Support general linear expression for capacities.
<p> <p>(user): Some model applies the same capacity to both an arc and its
reverse. Also support this case.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a5453ae22e516e4fb4216ea56bab9d860 "operations_research::sat::CreateNoOverlap2dCompletionTimeCutGenerator" (SchedulingConstraintHelper *x_helper, SchedulingConstraintHelper *y_helper, Model *model)</dt><dd> \anchor _todo001582 (user): Use improved energy from demands helper.
<p> \anchor _todo001581 (user): It might be possible/better to use some shifted value
here, but for now this code is not in the hot spot, so better be
defensive and only do connected components on really disjoint
rectangles.
<p> \anchor _todo001580 (user): Use demands_helper and decomposed energy.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ae19357ee0ddd4752e39f7bbf6cb3ae05 "operations_research::sat::CreateNoOverlap2dEnergyCutGenerator" (SchedulingConstraintHelper *x_helper, SchedulingConstraintHelper *y_helper, SchedulingDemandHelper *x_demands_helper, SchedulingDemandHelper *y_demands_helper, const std::vector< std::vector< LiteralValueValue > > &energies, Model *model)</dt><dd> \anchor _todo001576 (user): It might be possible/better to use some shifted value
here, but for now this code is not in the hot spot, so better be
defensive and only do connected components on really disjoint
rectangles.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a28abd2fe9199829f0c98ade48cfe459c "operations_research::sat::CreatePositiveMultiplicationCutGenerator" (AffineExpression z, AffineExpression x, AffineExpression y, int linearization_level, Model *model)</dt><dd> \anchor _todo001550 (user): As the bounds change monotonically, these cuts
dominate any previous one. try to keep a reference to the cut and
replace it. Alternatively, add an API for a level-zero bound change
callback.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ac42512151ce09329c676c59296f4ab6a "operations_research::sat::Cumulative" )(const std::vector< IntervalVariable > &vars, const std::vector< AffineExpression > &demands, AffineExpression capacity, SchedulingConstraintHelper *helper)</dt><dd> \anchor _todo001498 (user): A better place for stuff like this could be in the
presolver so that it is easier to disable and play with alternatives.
<p> \anchor _todo001504 (user): If more than one variable are after the same set of
intervals, we should regroup them in a single constraint rather than
having two independent constraint doing the same propagation.
<p> \anchor _todo001503 (user): This can lead to many constraints. By analyzing a bit more
the precedences, we could restrict that. In particular for cases were
the cumulative is always (bunch of tasks B), T, (bunch of tasks A) and
task T always in the middle, we never need to explicit list the
precedence of a task in B with a task in A.<p> \anchor _todo001502 (user): Handle generic affine relation?
<p> \anchor _todo001501 (user): There is a bit of code duplication with the disjunctive
precedence propagator. Abstract more?
<p> \anchor _todo001500 (user): this require the precedence constraints to be already loaded,
and there is no guarantee of that currently. Find a more robust way.<p> \anchor _todo001499 (user): Models that include the makespan as a special interval might
be better, but then not everyone does that. In particular this code
allows to have decent lower bound on the large cumulative minizinc
instances.<p> \anchor _todo001497 (user): Another "known" idea is to detect pair of tasks that must
be in disjunction and to create a Boolean to indicate which one is
before the other. It shouldn't change the propagation, but may result
in a faster one with smaller explanations, and the solver can also take
decision on such Boolean.<p> \anchor _todo001496 (user): Do proper experiments to see how beneficial this is, the
disjunctive will propagate more but is also using slower algorithms.
That said, this is more a question of optimizing the disjunctive
propagation code.<p> \anchor _todo001495 (user): We need to exclude intervals that can be of size zero
because the disjunctive do not "ignore" them like the cumulative
does. That is, the interval [2,2) will be assumed to be in
disjunction with [1, 3) for instance. We need to uniformize the
handling of interval with size zero.
<p> \anchor _todo001494 (user): Change that since we have optional interval
for this.
</dd> <dt>
\_setscope operations_research::sat::CumulativeEnergyConstraint Member \_internalref classoperations__research_1_1sat_1_1CumulativeEnergyConstraint#a1058cbb9c9572113e896f5c7c471eacc "operations_research::sat::CumulativeEnergyConstraint::Propagate" () final</dt><dd> \anchor _todo001511 (user): Improve window_end using envelope of critical event.
<p> \anchor _todo001510 (user): the same required task can have its energy pruned
several times, making this algorithm O(n^2 log n). Is there a way
to get the best pruning in one go? This looks like edge-finding not
being able to converge in one pass, so it might not be easy.
<p> \anchor _todo001509 <p> \anchor _todo001508 (user): This could be done lazily.
<p> \anchor _todo001507 (user): We do not need the capacity max in the reason, but by using
a lower one, we could maybe have propagated more the minimum capacity.
investigate.
<p> \anchor _todo001506 (user): force capacity_max >= 0, fail/remove optionals when 0.
<p> \anchor _todo001505 (user): just keep the current direction?
</dd> <dt>
\_setscope operations_research::sat::CumulativeIsAfterSubsetConstraint Class \_internalref classoperations__research_1_1sat_1_1CumulativeIsAfterSubsetConstraint "operations_research::sat::CumulativeIsAfterSubsetConstraint" </dt><dd> \anchor _todo001513 (user): I am not sure this is the best way, but it does at least push
the level zero bound on the large cumulative instances.
</dd> <dt>
\_setscope operations_research::sat::CumulativeIsAfterSubsetConstraint Member \_internalref classoperations__research_1_1sat_1_1CumulativeIsAfterSubsetConstraint#a9d0445b319d93772786a042918c970c2 "operations_research::sat::CumulativeIsAfterSubsetConstraint::Propagate" () final</dt><dd> \anchor _todo001512 (user): actually, we will push using the
last task, and the reason will be non-optimal, fix.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#af421daf12e0e45a0bb3cc7655cd443cc "operations_research::sat::CumulativePrecedenceSearchHeuristic" (Model *model)</dt><dd> \anchor _todo001744 <p> \anchor _todo001745 (user): unfortunately we can't report it from here.
<p> \anchor _todo001746 (user): add heuristic criteria, right now we stop at first
one. See above.
<p> \anchor _todo001743 (user): We need to add the reason for demand_min and capacity_max.
<p> \anchor _todo001742 (user): Add heuristic ordering for creating interesting precedence
first.
<p> \anchor _todo001741 (user): If the two box cannot overlap because of high demand, use
repo.CreateDisjunctivePrecedenceLiteral() instead.<p> \anchor _todo001740 (user): tie-break tasks not fitting in the profile smartly.
</dd> <dt>
\_setscope operations_research::sat::CutDataBuilder Member \_internalref classoperations__research_1_1sat_1_1CutDataBuilder#a6c27f24f411983fa4e7333dcadb9fd55 "operations_research::sat::CutDataBuilder::ConvertToLinearConstraint" (const CutData &cut, LinearConstraint *output)</dt><dd> \anchor _todo001514 (user): Divide by gcd first to avoid possible overflow in the
conversion? it is however unlikely given that our coeffs should be small.
</dd> <dt>
\_setscope operations_research::sat::DebugSolution Member \_internalref structoperations__research_1_1sat_1_1DebugSolution#a75a5eb5425c964642cf9be0cfb6b6c7b "operations_research::sat::DebugSolution::ivar_has_value" </dt><dd> \anchor _todo001687 (user): When this happen we should be able to infer the value of these
derived variable in the solution. For now, we only do that for the
objective variable.
</dd> <dt>
\_setscope operations_research::sat::DecompositionGraphNeighborhoodGenerator Class \_internalref classoperations__research_1_1sat_1_1DecompositionGraphNeighborhoodGenerator "operations_research::sat::DecompositionGraphNeighborhoodGenerator" </dt><dd> \anchor _todo001161 (user): Doing the full heuristic treewidth decomposition is probably
better because when we grow the current neighborhood, just using local
connection to the current candidate is probably not enough to orient the
search towards a good final neighborhood.
</dd> <dt>
\_setscope operations_research::sat::DecompositionGraphNeighborhoodGenerator Member \_internalref classoperations__research_1_1sat_1_1DecompositionGraphNeighborhoodGenerator#af329eaefae094534e41a135a9b6443af "operations_research::sat::DecompositionGraphNeighborhoodGenerator::Generate" (const CpSolverResponse &initial_solution, double difficulty, absl::BitGenRef random) final</dt><dd> \anchor _todo001151 (user): Does starting by a constraint make sense too?
</dd> <dt>
\_setscope operations_research::sat::DelayedRootLevelDeduction Struct \_internalref structoperations__research_1_1sat_1_1DelayedRootLevelDeduction "operations_research::sat::DelayedRootLevelDeduction" </dt><dd> \anchor _todo001681 (user): If we change the logic to not restart right away, we probably
need to remove duplicates bounds for the same variable.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a3423c28a2a00161e74d9c6e0174bcbf6 "operations_research::sat::DetectAndExploitSymmetriesInPresolve" (PresolveContext *context)</dt><dd> \anchor _todo001474 (user): We could remove these rows from the orbitope. Note that
currently this never happen on the miplib (maybe in LNS though).
<p> \anchor _todo001475 (user): We don't have any at most one relation on this orbitope,
but we could still add symmetry breaking inequality by picking any matrix
entry and making it the largest/lowest value on its row. This also work
for non-Booleans.
<p> \anchor _todo001473 (user): maybe we should simplify the constraint using the variable
we fix before choosing the next row to break symmetry on. If there are
multiple row involved, we could also take the intersection instead of
probably counting the same constraints more than once.
<p> \anchor _todo001472 (user): for 2/ and 3/ we could add an at most one constraint on the
full orbit if it is not already there!<p> \anchor _todo001476 (user): All choices should be equivalent, but double check?
<p> \anchor _todo001471 (user): The code below requires that no variable appears twice in the
same at most one. In particular lit and not(lit) cannot appear in the same
at most one.
<p> \anchor _todo001470 (user): Compute the stabilizer under the only non-fixed element and
iterate!
<p> \anchor _todo001469 (user): Actually the constraint we add is really just breaking the
orbitope symmetry on one line. But this line being the objective is key. We
can also explicitly look for a full permutation group of the objective
terms directly instead of finding the largest orbitope first.
<p> \anchor _todo001468 (user): generalize somehow. See if we can exploit this in
lb_tree_search directly. We also have a lot more structure than just the
objective can be ordered. Like if the objective is a max, we can still do
that.<p> \anchor _todo001467 (user): code the generic approach with orbits and stabilizer.
<p> \anchor _todo001465 (user): Doing that is not always good, on cod105.mps, fixing variables
instead of letting the innner solver handle Boolean symmetries make the
problem unsolvable instead of easily solved. This is probably because this
fixing do not exploit the full structure of these symmeteries. Note
however that the fixing via propagation above close cod105 even more
efficiently.
<p> \anchor _todo001466 (user): The same effect could be achieved by adding symmetry breaking
constraints of the form "a >= b " between Booleans and let the presolve do
the reduction. This might be less code, but it is also less efficient.
Similarly, when we cannot just fix variables to break symmetries, we could
add these constraints, but it is unclear if we should do it all the time or
not.</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a753e3aea07903c667891eb57036d26de "operations_research::sat::DetectImpliedIntegers" (MPModelProto *mp_model, SolverLogger *logger)</dt><dd> \anchor _todo001925 (user): If we scale more we migth be able to turn it into an
integer.
<p> \anchor _todo001924 (user): be smarter! we should be able to handle these cases.
<p> \anchor _todo001935 (user): Actually implement the offset part. This currently only happens
on the 3 neos-46470* miplib problems where we have a non-integer rhs.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a825c5b32096a00edc3e2e3fd78c7d541 "operations_research::sat::DetectMakespan" (const std::vector< IntervalVariable > &intervals, const std::vector< AffineExpression > &demands, const AffineExpression &capacity, Model *model)</dt><dd> \anchor _todo001901 (user): Supports variable capacity.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a3216f11aeb59c8cd63d2a1e8cdc6d47b "operations_research::sat::DetectOptionalVariables" (const CpModelProto &model_proto, Model *m)</dt><dd> \anchor _todo001181 (user): This deals with the simplest cases, but we could try to
detect literals that implies all the constraints in which a variable
appear to false. This can be done with a LCA computation in the tree of
Boolean implication (once the presolve remove cycles). Not sure if we can
properly exploit that afterwards though. Do some research!
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a33798fe85208035f149a5c124b89b7b4 "operations_research::sat::DisjunctivePrecedenceSearchHeuristic" (Model *model)</dt><dd> \anchor _todo001739 (Fdid): Also compare the second part of the precedence in
PrecedenceIsBetter() and not just the interval before?
<p> \anchor _todo001738 (user): Use conditional lower bounds? note that in automatic search
all precedence will be fixed before this is called though. In fixed
search maybe we should use the other SchedulingSearchHeuristic().
<p> \anchor _todo001737 <p> \anchor _todo001736 (user): tie break by size/start-max
</dd> <dt>
\_setscope operations_research::sat::DisjunctiveWithTwoItems Member \_internalref classoperations__research_1_1sat_1_1DisjunctiveWithTwoItems#aded29605fb1b5e0a55697fabdc9797ae "operations_research::sat::DisjunctiveWithTwoItems::Propagate" () final</dt><dd> \anchor _todo001589 (user): For optional interval whose presence in unknown and without
optional variable, the end-min may not be propagated to at least (start_min
+ size_min). Consider that into the computation so we may decide the
interval forced absence? Same for the start-max.
</dd> <dt>
\_setscope operations_research::sat::DivisionPropagator Class \_internalref classoperations__research_1_1sat_1_1DivisionPropagator "operations_research::sat::DivisionPropagator" </dt><dd> \anchor _todo001719 (user): Deal with overflow.
</dd> <dt>
\_setscope operations_research::sat::DivisionPropagator Member \_internalref classoperations__research_1_1sat_1_1DivisionPropagator#ac89f35a696a3d291bfafae382a1332ca "operations_research::sat::DivisionPropagator::Propagate" () final</dt><dd> \anchor _todo001713 (user): We can propagate more, especially in the case where denom
spans across 0.
<p> <p>(user): We can propagate a bit more if min_div = 0:
(min_num > -min_denom).
</dd> <dt>
\_setscope operations_research::sat::DomainDeductions Class \_internalref classoperations__research_1_1sat_1_1DomainDeductions "operations_research::sat::DomainDeductions" </dt><dd> \anchor _todo002082 (user): Also propagate implicit clauses (lit, not(lit)). Maybe merge
that with probing code? it might be costly to store all deduction done by
probing though, but I think this is what MIP solver do.
<p> \anchor _todo002081 (user): Also use these "deductions" in the solver directly. This is done
in good MIP solvers, and we should exploit them more.</dd> <dt>
\_setscope operations_research::sat::DomainDeductions Member \_internalref classoperations__research_1_1sat_1_1DomainDeductions#a90eec97bf72d63f4c921156b3f31c5a4 "operations_research::sat::DomainDeductions::ProcessClause" (absl::Span< const int > clause)</dt><dd> \anchor _todo002085 (user): We could probably be even more efficient. We could also
compute exactly what clauses need to be "waked up" as new deductions are
added.
</dd> <dt>
\_setscope operations_research::sat::DratProofHandler Member \_internalref classoperations__research_1_1sat_1_1DratProofHandler#a024232f8972a7dcb6cbf91ec8fe36fb0 "operations_research::sat::DratProofHandler::ApplyMapping" (const absl::StrongVector< BooleanVariable, BooleanVariable > &mapping)</dt><dd> \anchor _todo001609 (user): This is exactly the same mecanism as in the SatPostsolver
class. Factor out the code.
</dd> <dt>
\_setscope operations_research::sat::DualBoundStrengthening Class \_internalref classoperations__research_1_1sat_1_1DualBoundStrengthening "operations_research::sat::DualBoundStrengthening" </dt><dd> \anchor _todo002357 (user): This is actually an important step to do before scaling as it can
usually reduce really large bounds!
</dd> <dt>
\_setscope operations_research::sat::DualBoundStrengthening Member \_internalref classoperations__research_1_1sat_1_1DualBoundStrengthening#aa3f78681f549714a6bcfabc007aa985d "operations_research::sat::DualBoundStrengthening::CannotDecrease" (absl::Span< const int > refs, int ct_index=-1)</dt><dd> \anchor _todo002340 (user): No need to set locking_ct_index_[var] if num_locks_[var] > 1
</dd> <dt>
\_setscope operations_research::sat::DualBoundStrengthening Member \_internalref classoperations__research_1_1sat_1_1DualBoundStrengthening#a162bcb064138a579ee8192ffb9c244cb "operations_research::sat::DualBoundStrengthening::Strengthen" (PresolveContext *context)</dt><dd> \anchor _todo002343 (user): We can also deal with more than one enforcement.
<p> \anchor _todo002344 (user): Generalize to non-Boolean. Also for Boolean, we might
miss some possible reduction if replacing X by 1 - X make a constraint
near-duplicate of another.<p> \anchor _todo002345 (user): We can generalize to non-linear constraint.<p> \anchor _todo002346 (user): Make sure implication graph is transitively reduced to not
miss such reduction. More generally, this might only use the graph rather
than the encoding into bool_and / at_most_one ? Basically if a =>
all_direct_deduction, we can transform it into a <=> all_direct_deduction
if that is interesting. This could always be done on a max-2sat problem
in one of the two direction. Also think about max-2sat specific presolve.
<p> \anchor _todo002342 (user): Fix variable right away rather than waiting for next call.
<p> \anchor _todo002341 (user): Cover all the cases.
</dd> <dt>
\_setscope operations_research::sat::EncodingNode Member \_internalref classoperations__research_1_1sat_1_1EncodingNode#a4db8bdd99cd1c21623273512082cd8a6 "operations_research::sat::EncodingNode::GenericNode" (int lb, int ub, std::function< Literal(int x)> create_lit, Coefficient weight)</dt><dd> \anchor _todo001611 (user): Not ideal, we should probably just provide index in the
original objective for sorting purpose.
</dd> <dt>
\_setscope operations_research::sat::EncodingNode Member \_internalref classoperations__research_1_1sat_1_1EncodingNode#a93fd5b911e64c63ed4b1b32dc42a571d "operations_research::sat::EncodingNode::TransformToBoolean" (SatSolver *solver)</dt><dd> \anchor _todo001612 (user): Avoid creating a Boolean just to fix it!
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7a06f4fc45a6ed31a2afe1e20b6ed652 "operations_research::sat::ExactlyOnePerRowAndPerColumn" )(const std::vector< std::vector< Literal > > &graph)</dt><dd> \anchor _todo001047 (user): Change to a sparse API like for the function above.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a265b8cf37f58fb2c78b247a6412ce519 "operations_research::sat::ExploitDominanceRelations" (const VarDomination &var_domination, PresolveContext *context)</dt><dd> \anchor _todo002354 (user): if both variable are in a bool_or, this will allow us to
remove the dominated variable. Maybe we should exploit that to decide
which implication we add. Or just remove such variable and not add the
implications?<p> \anchor _todo002355 (user): generalize to non Booleans?
<p> \anchor _todo002353 (user): More generally, combine with probing? if a dominated
variable implies one of its dominant to zero, then it can be set to
zero. It seems adding the implication below should have the same
effect? but currently it requires a lot of presolve rounds.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a97b2ab4ecaa7da4d40522982c3e221e4 "operations_research::sat::ExtractAllSubsetsFromForest" (const std::vector< int > &parent, std::vector< int > *subset_data, std::vector< absl::Span< const int > > *subsets, int node_limit)</dt><dd> \anchor _todo002120 (user): This also allocate O(n) memory internally, we could reuse it from
call to call if needed.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a89efb582832622f508e29d0c32f56ca9 "operations_research::sat::ExtractElementEncoding" (const CpModelProto &model_proto, Model *m)</dt><dd> \anchor _todo001178 (user): It should be safe otherwise the exactly_one will have
duplicate literal, but I am not sure that if presolve is off we can
assume that.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#afa73e23a5cfae0eaf253c2e2518e05e7 "operations_research::sat::ExtractEncoding" (const CpModelProto &model_proto, Model *m)</dt><dd> \anchor _todo001172 (user): We will re-add the same implied bounds during probing, so
it might not be necessary to do that here. Also, it might be too early
if some of the literal view used in the LP are created later, but that
should be fixable via calls to implied_bounds->NotifyNewIntegerView().
<p> \anchor _todo001171 (user): Debug what makes it unsat at this point.
<p> \anchor _todo001170 (user): Regroup/presolve two encoding like b => x > 2 and the same
Boolean b => x > 5. These shouldn't happen if we merge linear constraints.
<p> \anchor _todo001173 (user): In these cases, we could fix the enforcement literal right
away or ignore the constraint. Note that it will be done later anyway
though.
<p> \anchor _todo001174 (user): Fully encode variable that are almost fully encoded?
<p> \anchor _todo001175 (user): Try to remove it. Normally we caught UNSAT above, but
tests are very flaky (it only happens in parallel). Keeping it there for
the time being.
<p> \anchor _todo001176 (user): delay this after PropagateEncodingFromEquivalenceRelations()?
Otherwise we might create new Boolean variables for no reason. Note
however, that in the presolve, we should only use the "representative" in
linear constraints, so we should be fine.
<p> \anchor _todo001177 (user): It is not 100% clear what is the best encoding and if
we should create equivalent literal or rely on propagator instead
to push bounds.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ac9d08e5135a1ae71b571b14fbff3381b "operations_research::sat::FailedLiteralProbingRound" (ProbingOptions options, Model *model)</dt><dd> \anchor _todo002092 (user): Instead of minimizing index in topo order (which might be
nice for binary extraction), we could try to maximize reusability in
some way.
<p> \anchor _todo002097 (user): We might just want to do that even more lazily by
checking for detached clause while propagating here? and do a big
cleanup at the end.
<p> \anchor _todo002093 (user): Can we be smarter here? Maybe we can still fix the
literal without going back to level zero by simply enqueuing it with
no reason? it will be backtracked over, but we will still lazily fix
it later.
<p> \anchor _todo002094 (user): We could be slightly more generic and subsume some
clauses that do not contains last_decision.Negated().
<p> \anchor _todo002095 (user): Think about trying to extract clause that will not
get removed by transitive reduction later. If we can both extract
a => c and b => c , ideally we don't want to extract a => c first
if we already know that a => b.<p> \anchor _todo002096 (user): Similar to previous point, we could find the LCA
of all literals in the reason for this propagation. And use this
as a reason for later hyber binary resolution. Like we do when
this clause subsume the reason.
</dd> <dt>
\_setscope operations_research::sat::FeasibilityJumpSolver Class \_internalref classoperations__research_1_1sat_1_1FeasibilityJumpSolver "operations_research::sat::FeasibilityJumpSolver" </dt><dd> \anchor _todo001630 (user): If we have more than one of these solver, we might want to share
the evaluator memory between them. Right now we basically keep a copy of the
model and its transpose for each FeasibilityJumpSolver.
</dd> <dt>
\_setscope operations_research::sat::FeasibilityJumpSolver Member \_internalref classoperations__research_1_1sat_1_1FeasibilityJumpSolver#adc255845d619b5cf9077d19faecb8762 "operations_research::sat::FeasibilityJumpSolver::GenerateTask" (int64_t) final</dt><dd> \anchor _todo001624 (user): Maybe have one worker with very low restart
rate.
<p> \anchor _todo001623 <p> \anchor _todo001622 (user): Ideally batch should use deterministic time too so we
can just use number of batch for the luby restart.
<p> \anchor _todo001621 (user): Tune the improvement constant, maybe use luby.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a300f624fabbec583376b6e87dcb6fbda "operations_research::sat::FillSolveStatsInResponse" (Model *model, CpSolverResponse *response)</dt><dd> \anchor _todo002291 (user): find a way to clear all stats fields that might be set by
one of the callback.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a76d6dd44958673bb83ac31e970539135 "operations_research::sat::FindBestScalingAndComputeErrors" (const std::vector< double > &coefficients, const std::vector< double > &lower_bounds, const std::vector< double > &upper_bounds, int64_t max_absolute_activity, double wanted_absolute_activity_precision, double *relative_coeff_error, double *scaled_sum_error)</dt><dd> \anchor _todo001933 (user): unit test this and move to fp_utils.
<p> <p>(user): Ideally the lower/upper should be int64_t so that we can have
an exact definition for the max_absolute_activity allowed.
<p> \anchor _todo001926 (user): Make this faster.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ae16bafcf3c5377ed905021a96f93bdcf "operations_research::sat::FindCpModelSymmetries" (const SatParameters ¶ms, const CpModelProto &problem, std::vector< std::unique_ptr< SparsePermutation > > *generators, double deterministic_limit, SolverLogger *logger)</dt><dd> \anchor _todo001464 (user): Change the API to not return an error when the time limit is
reached.
<p> \anchor _todo001490 (user): On SAT problems it is more powerful to detect permutations also
involving the negation of the problem variables. So that we could find a
symmetry x <-> not(y) for instance.<p> \anchor _todo001491 (user): As long as we only exploit symmetry involving only Boolean
variables we can make this code more efficient by not detecting symmetries
involing integer variable.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2e4999dc16f55afa8c5d30a733a26e3d "operations_research::sat::FindDuplicateConstraints" (const CpModelProto &model_proto, bool ignore_enforcement)</dt><dd> \anchor _todo001375 (user): we could delete duplicate identical interval, but we need
to make sure reference to them are updated.
<p> \anchor _todo001376 (user): This is not particularly efficient.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a75271e8da6c6cb4c5c87226e150d47d7 "operations_research::sat::FindLinearBooleanProblemSymmetries" (const LinearBooleanProblem &problem, std::vector< std::unique_ptr< SparsePermutation > > *generators)</dt><dd> \anchor _todo001036 (user): Remove them beforehand?
<p> \anchor _todo001035 (user): inject the appropriate time limit here.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7492392221bdfcc832cce2d93c9b681c "operations_research::sat::FingerprintModel" (const CpModelProto &model, uint64_t seed=kDefaultFingerprintSeed)</dt><dd> \anchor _todo001492 (user): Should we fingerprint decision strategies?
</dd> <dt>
\_setscope operations_research::sat::FirstFewValues Class \_internalref classoperations__research_1_1sat_1_1FirstFewValues "operations_research::sat::FirstFewValues< n >" </dt><dd> \anchor _todo002330 (user): Maybe modulo some prime number we can keep more info.
<p> <p>(user): Another common case is a bunch of really small values and larger
ones, so we could bound the sum of the small values and keep the first few
reachable by the big ones. This is similar to some presolve transformations.
</dd> <dt>
\_setscope operations_research::sat::FirstFewValues Member \_internalref classoperations__research_1_1sat_1_1FirstFewValues#afb10d079fe78aa99d7256c85f6d24bde "operations_research::sat::FirstFewValues< n >::Add" (const int64_t positive_value)</dt><dd> \anchor _todo002335 (user): Implement Add() with an upper bound on the multiplicity.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a8c72a9619e1961d1434170437536cff6 "operations_research::sat::FirstUnassignedVarAtItsMinHeuristic" (const std::vector< IntegerVariable > &vars, Model *model)</dt><dd> \anchor _todo001730 (user): the complexity caused by the linear scan in this heuristic and
the one below is ok when search_branching is set to SAT_SEARCH because it is
not executed often, but otherwise it is done for each search decision,
which seems expensive. Improve.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a529a0a81c6633bad7cfc0500457497a6 "operations_research::sat::FixedWeightedSumReif" )(Literal is_eq, const std::vector< IntegerVariable > &vars, const VectorInt &coefficients, int64_t value)</dt><dd> \anchor _todo001724 (user): Simplify if the constant is at the edge of the possible values.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a392d70cc768a13de271f87123513acf2 "operations_research::sat::FloorSquareRoot" (int64_t a)</dt><dd> \anchor _todo002322 (user): Find better implementation? In pratice passing via double is
almost always correct, but the CapProd() might be a bit slow. However this
is only called when we do propagate something.
</dd> <dt>
\_setscope operations_research::sat::FlowCoverCutHelper Member \_internalref classoperations__research_1_1sat_1_1FlowCoverCutHelper#af7fca0dc3ced6d077248ca695664ec7c "operations_research::sat::FlowCoverCutHelper::GenerateCut" (const SingleNodeFlow &data)</dt><dd> \anchor _todo001558 (user): Support int128 demand.
<p> \anchor _todo001559 (user): Also try to generate the extended generalized flow cover
inequality (EGFCI).
<p> \anchor _todo001560 (user): Lift the cut.
</dd> <dt>
\_setscope operations_research::sat::FlowInfo Struct \_internalref structoperations__research_1_1sat_1_1FlowInfo "operations_research::sat::FlowInfo" </dt><dd> \anchor _todo001565 (user): Altough the cut should still be correct, we might use the same
Boolean more than once in the implied bound. Or this Boolean might already
appear in the constraint. Not sure if we can do something smarter here.
<p> \anchor _todo001564 (user): cover case 3/. We loose a lot of relaxation here, except if
the variable is at is upper/lower bound.</dd> <dt>
\_setscope operations_research::sat::FlowInfo Member \_internalref structoperations__research_1_1sat_1_1FlowInfo#aa410b7d167f57e67a443c0adc2c6db20 "operations_research::sat::FlowInfo::flow_lp_value" </dt><dd> \anchor _todo001568 (user): We don't use this in the heuristic currently.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a36bf1351ffa74960b3040a96ddc37468 "operations_research::sat::FullyCompressTuples" (absl::Span< const int64_t > domain_sizes, std::vector< std::vector< int64_t > > *tuples)</dt><dd> \anchor _todo002326 (user): We can probably reuse the tuples memory always and never create
new one. We should also be able to code an iterative version of this. Note
however that the recursion level is bounded by the number of coluns which
should be small.
<p> \anchor _todo002331 (user): To reduce memory, we could return some absl::Span in the last
layer instead of vector.<p> \anchor _todo002332 (user): The final compression is depend on the order of the variables.
For instance the table (1,1)(1,2)(1,3),(1,4),(2,3) can either be compressed
as (1,*)(2,3) or (1,{1,2,4})({1,3},3). More experiment are needed to devise
a better heuristic. It might for example be good to call CompressTuples()
first.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a40a7dc0d395ce5d73a04705001e71627 "operations_research::sat::GenerateCompletionTimeCutsWithEnergy" (const std::string &cut_name, std::vector< CtEvent > events, IntegerValue capacity_max, bool skip_low_sizes, Model *model, LinearConstraintManager *manager)</dt><dd> \anchor _todo002253 (user): merge with Packing cuts.
<p> \anchor _todo002254 (user): Check overflow and ignore if too big.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a5639ced88667030a20e68a36dc849a43 "operations_research::sat::GenerateCumulativeEnergeticCuts" (const std::string &cut_name, const absl::StrongVector< IntegerVariable, double > &lp_values, std::vector< EnergyEvent > events, const AffineExpression &capacity, TimeLimit *time_limit, Model *model, LinearConstraintManager *manager)</dt><dd> \anchor _todo002250 (user): We could reduce this set.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a6517c71e66173c1ac5c27bad82353081 "operations_research::sat::GenerateCumulativeEnergeticCutsWithMakespanAndFixedCapacity" (absl::string_view cut_name, const absl::StrongVector< IntegerVariable, double > &lp_values, std::vector< EnergyEvent > events, IntegerValue capacity, AffineExpression makespan, TimeLimit *time_limit, Model *model, LinearConstraintManager *manager)</dt><dd> \anchor _todo002247 (user): We could reduce this set.
<p> \anchor _todo002248 <p> \anchor _todo002249 (user): we can compute the max usage between makespan_min and
makespan_max.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#af2a840612629fd37d42870c23e183609 "operations_research::sat::GenerateGraphForSymmetryDetection" (const LinearBooleanProblem &problem, std::vector< int > *initial_equivalence_classes)</dt><dd> \anchor _todo001034 (user): reserve the memory for the graph? not sure it is worthwhile
since it would require some linear scan of the problem though.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aef4b159d28945ac73ef965c2db5c18d5 "operations_research::sat::GenerateNoOvelap2dCompletionTimeCutsWithEnergy" (absl::string_view cut_name, std::vector< DiffnCtEvent > events, bool use_lifting, bool skip_low_sizes, Model *model, LinearConstraintManager *manager)</dt><dd> \anchor _todo001578 (user): Use dynamic programming to compute all possible values for
the sum of demands as long as the involved numbers are small or the
number of tasks are small.
<p> \anchor _todo001577 (user): merge with Packing cuts.
<p> \anchor _todo001579 (user): Check overflow and ignore if too big.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a53c4d8406e1afd37e5a99ed333207f32 "operations_research::sat::GenerateShortCompletionTimeCutsWithExactBound" (const std::string &cut_name, std::vector< CtEvent > events, IntegerValue capacity_max, Model *model, LinearConstraintManager *manager)</dt><dd> \anchor _todo002252 (user): Improve performance
- detect disjoint tasks (no need to crossover to the second part)
- better caching of explored states
</dd> <dt>
\_setscope operations_research::sat::GenericLiteralWatcher Class \_internalref classoperations__research_1_1sat_1_1GenericLiteralWatcher "operations_research::sat::GenericLiteralWatcher" </dt><dd> \anchor _todo001683 (user): Move this to its own file. Add unit tests!
</dd> <dt>
\_setscope operations_research::sat::GenericLiteralWatcher Member \_internalref classoperations__research_1_1sat_1_1GenericLiteralWatcher#ad53c31fda5130ffda98dbb242faf3145 "operations_research::sat::GenericLiteralWatcher::GenericLiteralWatcher" (Model *model)</dt><dd> \anchor _todo001676 (user): This propagator currently needs to be last because it is the
only one enforcing that a fix-point is reached on the integer variables.
Figure out a better interaction between the sat propagation loop and
this one.
</dd> <dt>
\_setscope operations_research::sat::GenericLiteralWatcher Member \_internalref classoperations__research_1_1sat_1_1GenericLiteralWatcher#a23370d30fab5bc955f314d3ced9add4a "operations_research::sat::GenericLiteralWatcher::Propagate" (Trail *trail) final</dt><dd> \anchor _todo001679 (user): However, on some problem, it seems to work better to not
do that. One possible reason is that the reason of a "natural"
propagation might be better than one we learned.
<p> \anchor _todo001678 (user): Maybe just provide one function Propagate(watch_indices) ?
<p> \anchor _todo001677 (user): The queue will not be emptied, but I am not sure the solver
will be left in an usable state. Fix if it become needed to resume
the solve from the last time it was interrupted.
</dd> <dt>
\_setscope operations_research::sat::GenericLiteralWatcher Member \_internalref classoperations__research_1_1sat_1_1GenericLiteralWatcher#ab3993b47fa18e5a83198e062ded08bb7 "operations_research::sat::GenericLiteralWatcher::Register" (PropagatorInterface *propagator)</dt><dd> \anchor _todo001680 (user): This initial propagation does not respect any later priority
settings. Fix this. Maybe we should force users to pass the priority at
registration. For now I didn't want to change the interface because there
are plans to implement a kind of "dynamic" priority, and if it works we may
want to get rid of this altogether.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a5da173a94bec567c831df465aae5c5e4 "operations_research::sat::GetDiverseSetOfParameters" (const SatParameters &base_params, const CpModelProto &cp_model)</dt><dd> \anchor _todo001399 (user): Actually make sure the gap num_workers <-> num_heuristics is
contained.
<p> \anchor _todo001393 (user): For scheduling, this is important to find good first solution
but afterwards it is not really great and should probably be replaced by a
LNS worker.
<p> \anchor _todo001394 (user): Avoid launching two strategies if they are the same,
like if there is no lp, or everything is already linearized at level 1.
<p> \anchor _todo001395 (user): Enable probing_search in deterministic mode.
Currently it timeouts on small problems as the deterministic time limit
never hits the sharding limit.
<p> \anchor _todo001396 (user): Enable shaving search in interleave mode.
Currently it do not respect ^C, and has no per chunk time limit.
<p> \anchor _todo001397 (user): Enable lb_tree_search in deterministic mode.
<p> \anchor _todo001398 (user): Find a better randomization for the seed so that changing
random_seed() has more impact?
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aac3a6347c9f942af0cdca5180a9da297 "operations_research::sat::GetNamedParameters" (const SatParameters &base_params)</dt><dd> \anchor _todo001392 (user): Experiment with search_random_variable_pool_size.
<p> \anchor _todo001391 (user): Do more experiments, the LP with core could be useful, but we
probably need to incorporate the newly created integer variables from the
core algorithm into the LP.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aa8cc7ff53b39b6a28e821bc428dcb331 "operations_research::sat::GetOrbits" (int n, absl::Span< const std::unique_ptr< SparsePermutation > > generators)</dt><dd> \anchor _todo002289 (user): We could reuse the internal memory if needed.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#afa1020b89b12f653b1ea0dd0d595557e "operations_research::sat::GetSuperAdditiveRoundingFunction" (IntegerValue rhs_remainder, IntegerValue divisor, IntegerValue t, IntegerValue max_scaling)</dt><dd> \anchor _todo001516 (user): This function is not always maximal when
size % (max_scaling - 1) == 0. Improve?
<p> \anchor _todo001515 (user): Use everywhere a two step computation to avoid overflow?
First divide by divisor, then multiply by t. For now, we limit t so that
we never have an overflow instead.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7876cef7b031a084f24b5c5898c9710c "operations_research::sat::GetSuperAdditiveStrengtheningFunction" (IntegerValue positive_rhs, IntegerValue min_magnitude)</dt><dd> \anchor _todo001517 (user): Limit the number of value used with scaling like above.
<p> \anchor _todo001518 (user): we might want to intoduce some step to reduce the final
magnitude of the cut.
<p> \anchor _todo001566 (user): Extend it for ci >= max_magnitude, we can probaly "lift" such
coefficient.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a20a09de9399643ba3302d007c4663ea2 "operations_research::sat::GetWorkSharingParams" (const SatParameters &base_params, const CpModelProto &cp_model, int num_params_to_generate)</dt><dd> \anchor _todo001400 (user): We could support assumptions, it's just not implemented.
</dd> <dt>
\_setscope operations_research::sat::GreaterThanAtLeastOneOfPropagator Member \_internalref classoperations__research_1_1sat_1_1GreaterThanAtLeastOneOfPropagator#a3b3ae77e1959c1da3c086669f8c28062 "operations_research::sat::GreaterThanAtLeastOneOfPropagator::Propagate" () final</dt><dd> \anchor _todo001099 (user): This could be optimized by keeping more info from the last
Propagate() calls.
<p> \anchor _todo001098 (user): In case of a conflict, we could push one of them to false if
it is the only one.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#af6433b3a01c71cd754d3d710f345b4c0 "operations_research::sat::GreedyFastDecreasingGcd" (const absl::Span< const int64_t > coeffs)</dt><dd> \anchor _todo001586 (user): The following is a heuristic to make drop the GCD as fast
as possible. It might be suboptimal in general (as we could miss two
coprime coefficients for instance).
</dd> <dt>
\_setscope operations_research::sat::HittingSetOptimizer Class \_internalref classoperations__research_1_1sat_1_1HittingSetOptimizer "operations_research::sat::HittingSetOptimizer" </dt><dd> \anchor _todo001948 (user): This class requires linking with the SCIP MIP solver which is
quite big, maybe we should find a way not to do that.
</dd> <dt>
\_setscope operations_research::sat::HittingSetOptimizer Member \_internalref classoperations__research_1_1sat_1_1HittingSetOptimizer#a82f11613372a6a2909c2dc75bcd6216b "operations_research::sat::HittingSetOptimizer::Optimize" ()</dt><dd> \anchor _todo001947 (user): If we extract more than the objective variables, we could
use the solution values from the MPModel as hints to the SAT model.
<p> \anchor _todo001940 (user): remove code duplication with MinimizeWithCoreAndLazyEncoding();
<p> \anchor _todo001941 (user): Even though we keep the same solver, currently the solve is
not really done incrementally. It might be hard to improve though.<p> \anchor _todo001946 <p> \anchor _todo001942 (user): deal with time limit.
<p> \anchor _todo001943 (user): C^c is broken when using SCIP.
<p> \anchor _todo001945 (user): Use the real weights and exploit the extra cores.
<p> \anchor _todo001944 (user): It is actually easy to use a FEASIBLE result. If when
passing it to SAT it is no feasbile, we can still create cores. If it
is feasible, we have a solution, but we cannot increase the lower
bound.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ab3e33c3cfd5add0c1b5cc68be5fe2ab5 "operations_research::sat::Implication" )(const std::vector< Literal > &enforcement_literals, IntegerLiteral i)</dt><dd> \anchor _todo001684 (user): This is one of the rare case where it is better to use Equality()
rather than two Implications(). Maybe we should modify our internal
implementation to use half-reified encoding? that is do not propagate the
direction integer-bound => literal, but just literal => integer-bound? This
is the same as using different underlying variable for an integer literal and
its negation.
<p> \anchor _todo001685 (user): Double check what happen when we associate a trivially
true or false literal.
</dd> <dt>
\_setscope operations_research::sat::ImpliedBounds Class \_internalref classoperations__research_1_1sat_1_1ImpliedBounds "operations_research::sat::ImpliedBounds" </dt><dd> \anchor _todo001648 (user): Do like in the DomainDeductions class and allow to process
clauses (or store them) to perform more level zero deductions. Note that this
is again a slight duplicate with what we do there (except that we work at the
Domain level in that presolve class).<p> \anchor _todo001647 (user): This is a bit of a duplicate with the Literal <=> IntegerLiteral
stored in the IntegerEncoder class. However we only need one side here.<p> \anchor _todo001646 (user): This can quickly use up too much memory. Add some limit in place.
In particular, each time we have literal => integer_literal we should avoid
storing the same integer_literal for all other_literal for which
other_literal => literal. For this we need to interact with the
BinaryImplicationGraph.<p> \anchor _todo001649 (user): Add an implied bound cut generator to add these simple
constraints to the LP when needed.
</dd> <dt>
\_setscope operations_research::sat::ImpliedBounds Member \_internalref classoperations__research_1_1sat_1_1ImpliedBounds#accac5e129274770ef3d646e15aa13b1c "operations_research::sat::ImpliedBounds::Add" (Literal literal, IntegerLiteral integer_literal)</dt><dd> \anchor _todo001637 (user): Like in probing, we can also create hole in the domain if there
is some implied bounds for (literal.NegatedIndex, NegagtionOf(var)) that
crosses integer_literal.bound.
<p> \anchor _todo001636 (user): Check that this never happen? it shouldn't.
</dd> <dt>
\_setscope operations_research::sat::ImpliedBounds Member \_internalref classoperations__research_1_1sat_1_1ImpliedBounds#ace9f6e200fff7933263a014bb9d62fb8 "operations_research::sat::ImpliedBounds::GetImpliedBounds" (IntegerVariable var)</dt><dd> \anchor _todo001638 (user): Check no duplicate and remove old entry if the enforcement
is tighter.
</dd> <dt>
\_setscope operations_research::sat::ImpliedBoundsProcessor Member \_internalref classoperations__research_1_1sat_1_1ImpliedBoundsProcessor#aa292900f68528b54007deb7cdb6f4aec "operations_research::sat::ImpliedBoundsProcessor::DecomposeWithImpliedLowerBound" (const CutTerm &term, IntegerValue factor_t, CutTerm &bool_term, CutTerm &slack_term)</dt><dd> \anchor _todo001553 (user): Only do it if coeff_b > 0 ? But again we could still merge
B with an existing Boolean for a better cut even if coeff_b == 0.
<p> \anchor _todo001552 (user): Ignore if bound_diff == 1 ? But we can still merge B with
another entry if it exists, so it can still be good in this case.</dd> <dt>
\_setscope operations_research::sat::ImpliedBoundsProcessor Member \_internalref classoperations__research_1_1sat_1_1ImpliedBoundsProcessor#ad649c6a32bb8aeec245204ebd3c6fe15 "operations_research::sat::ImpliedBoundsProcessor::PostprocessWithImpliedBound" (const std::function< IntegerValue(IntegerValue)> &f, IntegerValue factor_t, CutData *cut, CutDataBuilder *builder)</dt><dd> \anchor _todo001555 (user): If the slack is close to zero, then this transformation
will always increase the violation. So we could potentially do it in
Before our divisor selection heuristic. But the norm of the final cut
will increase too.
<p> \anchor _todo001554 (user): Note that while the violation might be higher, if the slack
becomes large this will result in a less powerfull cut. Shall we do
that? It is a bit the same problematic with complementing.</dd> <dt>
\_setscope operations_research::sat::ImpliedBoundsProcessor Member \_internalref classoperations__research_1_1sat_1_1ImpliedBoundsProcessor#ace0dba418106eaaeca69f6adac3fff3e "operations_research::sat::ImpliedBoundsProcessor::TryToExpandWithLowerImpliedbound" (IntegerValue factor_t, int i, bool complement, CutData *cut, CutDataBuilder *builder)</dt><dd> \anchor _todo001556 (user): Because of merges, we might have entry with a coefficient of
zero than are not useful. Remove them.
</dd> <dt>
\_setscope operations_research::sat::InclusionDetector Member \_internalref classoperations__research_1_1sat_1_1InclusionDetector#ac5767e6b32e020c4e95dd254ab768620 "operations_research::sat::InclusionDetector< Storage >::DetectInclusions" (const std::function< void(int subset, int superset)> &process)</dt><dd> \anchor _todo001656 (user): Alternatively, we could clean is_in_superset_ in the
call to StopProcessingCurrentSuperset() and force client to call it
before altering the superset content.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ad715c4b2444c3b6fb162bc2382a2248e "operations_research::sat::IncreaseNodeSize" (EncodingNode *node, SatSolver *solver)</dt><dd> \anchor _todo001613 (user): Experiment more.
</dd> <dt>
\_setscope operations_research::sat::Inprocessing Class \_internalref classoperations__research_1_1sat_1_1Inprocessing "operations_research::sat::Inprocessing" </dt><dd> \anchor _todo002193 (user): Some algorithms here use the normal SAT propagation engine.
However we might want to temporarily disable activities/phase saving and so
on if we want to run them as in-processing steps so that they
do not "pollute" the normal SAT search.<p> \anchor _todo002194 (user): For the propagation, this depends on the SatSolver class, which
mean we cannot really use it without some refactoring as an in-processing
from the SatSolver::Solve() function. So we do need a special
InprocessingSolve() that lives outside SatSolver. Alternatively, we can
extract the propagation main loop and conflict analysis from SatSolver.
</dd> <dt>
\_setscope operations_research::sat::Inprocessing Member \_internalref classoperations__research_1_1sat_1_1Inprocessing#a3ab413def8a2242915ef31ff717baa17 "operations_research::sat::Inprocessing::DetectEquivalencesAndStamp" (bool use_transitive_reduction, bool log_info)</dt><dd> \anchor _todo002145 (user): consider doing the transitive reduction after each SCC.
It might be slow but we could try to make it more incremental to
compensate and it should allow further reduction.
</dd> <dt>
\_setscope operations_research::sat::Inprocessing Member \_internalref classoperations__research_1_1sat_1_1Inprocessing#aa0797dfc25a5c609254b61fe67828c11 "operations_research::sat::Inprocessing::InprocessingRound" ()</dt><dd> \anchor _todo002144 (user): try to enable these? The problem is that we can only remove
variables not used the non-pure SAT part of a model.
<p> \anchor _todo002143 (user): Add a small wrapper function to time this.
<p> \anchor _todo002141 (user): The LP and incremental structure will still be called though,
which can take some time, try to disable it more cleanly.
<p> \anchor _todo002142 (user): We should probably also disable the variable/clauses activity
updates.
</dd> <dt>
\_setscope operations_research::sat::Inprocessing Member \_internalref classoperations__research_1_1sat_1_1Inprocessing#a67d25dadf7669215ab5b27b4d8046e18 "operations_research::sat::Inprocessing::PresolveLoop" (SatPresolveOptions options)</dt><dd> \anchor _todo002139 (user): this break some binary graph invariant. Fix!
<p> \anchor _todo002137 (user): This should/could be integrated with the stamping since it
seems better to do just one loop instead of two over all clauses. Because
of memory access. it isn't that clear though.
<p> \anchor _todo002140 (user): Maintain the total number of literals in the watched clauses.
<p> \anchor _todo002138 (user): Combine the two? this way we don't create a full literal <->
clause graph twice. It might make sense to reach the BCE fix point which
is unique before each variable elimination.
</dd> <dt>
\_setscope operations_research::sat::Inprocessing Member \_internalref classoperations__research_1_1sat_1_1Inprocessing#a5e0f39f14f9c6d947181e7185d6ed865 "operations_research::sat::Inprocessing::RemoveFixedAndEquivalentVariables" (bool log_info)</dt><dd> \anchor _todo002149 (user): find a way to auto-tune that after a run on borg...
<p> \anchor _todo002147 (user): If only new fixed variables are there, we can use a faster
function. We should also merge the code with the deletion code in
sat_solver_.cc, but that require some refactoring of the dependence between
files.
<p> \anchor _todo002148 (user): we should output literal to the proof right away,
currently if we remove clauses before fixing literal the proof is
wrong.
<p> \anchor _todo002146 (user): The level zero is required because we remove fixed variables
but if we split this into two functions, we could rewrite clause at any
level.
</dd> <dt>
\_setscope operations_research::sat::Inprocessing Member \_internalref classoperations__research_1_1sat_1_1Inprocessing#a2fbf49af4f2bef7419f9eff0fc4847b2 "operations_research::sat::Inprocessing::SubsumeAndStrenghtenRound" (bool log_info)</dt><dd> \anchor _todo002160 (user): We could also move the watched literal first so we always
skip it.
<p> \anchor _todo002161 (user): tune the deterministic time.
<p> \anchor _todo002159 (user): We could/should sort the literal in this clause by
using literals that appear in a small number of clauses first so that
we maximize the chance of early abort in the critical loops above.<p> \anchor _todo002158 (user): No need to add this clause if we know it cannot subsume
any new clause since last round. i.e. unchanged clause that do not
contains any literals of newly added clause do not need to be added
here. We can track two bitset in LiteralWatchers via a register
mechanism:
- literal of newly watched clauses since last clear.
- literal of reduced clauses since last clear.<p> \anchor _todo002157 (user): remove first and see if other still removable. Alternatively
use a "removed" marker and redo a check for each clause that simplifies
this one? Or just remove the first one, and wait for next round.
<p> \anchor _todo002156 (user): Do some reduction using binary clauses. Note that only clause
that never propagated since last round need to be checked for binary
subsumption.
<p> \anchor _todo002150 (user): Use better work limits, see SAT09.CRAFTED.ramseycube.Q3inK12<p> \anchor _todo002151 (user): Be more incremental, each time a clause is added/reduced track
which literal are impacted? Also try to do orthogonal reductions from one
round to the next.
<p> \anchor _todo002152 (user): We could do that only if we do some reduction, but this is
quite fast though.
<p> \anchor _todo002153 (user): probably faster without the size indirection.
<p> \anchor _todo002154 (user): Storing signatures here might be faster?
<p> \anchor _todo002155 (user): Better abort limit. We could also limit the watcher sizes and
never look at really long clauses. Note that for an easier
incrementality, it is better to reach some kind of completion so we know
what new stuff need to be done.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Class \_internalref classoperations__research_1_1sat_1_1IntegerEncoder "operations_research::sat::IntegerEncoder" </dt><dd> \anchor _todo001682 (user): We could also lazily create precedences Booleans between two
arbitrary IntegerVariable. This is better done in the PrecedencesPropagator
though.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#a1a4e1df43e180231715e6fde6b4d0a8d "operations_research::sat::IntegerEncoder::Canonicalize" (IntegerLiteral i_lit) const</dt><dd> \anchor _todo001689 (user): This is linear in the domain "complexity", we can do better if
needed.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#a44f7926d822f4f2f659be6f503090ac4 "operations_research::sat::IntegerEncoder::FullyEncodeVariable" (IntegerVariable var)</dt><dd> \anchor _todo001659 (user): Currently, in some corner cases,
GetOrCreateLiteralAssociatedToEquality() might trigger some propagation
that update the domain of var, so we need to cache the values to not read
garbage. Note that it is okay to call the function on values no longer
reachable, as this will just do nothing.
<p> \anchor _todo001688 (user): It is currently only possible to call that at the decision
level zero because we cannot add ternary clause in the middle of the
search (for now). This is Checked.
<p> \anchor _todo001658 (user): Maybe we can optimize the literal creation order and their
polarity as our default SAT heuristics initially depends on this.</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#acb0b1234e31f51f99e14860cd628cde2 "operations_research::sat::IntegerEncoder::GetAssociatedLiteral" (IntegerLiteral i_lit) const</dt><dd> \anchor _todo001664 (user): Canonicalization might be slow.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#a86897b73c47086f4bc261f9424b47de7 "operations_research::sat::IntegerEncoder::GetOrCreateAssociatedLiteral" (IntegerLiteral i_lit)</dt><dd> \anchor _todo001662 (user): on some problem this happens. We should probably make sure that
we don't create extra fixed Boolean variable for no reason.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#af0a2aeea649e70334c5b44dca14a5ae2 "operations_research::sat::IntegerEncoder::GetOrCreateLiteralAssociatedToEquality" (IntegerVariable var, IntegerValue value)</dt><dd> \anchor _todo001663 (user): this happens on some problem. We should probably
make sure that we don't create extra fixed Boolean variable for no reason.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#a575c98a8e638de20b5a3a5861263c732 "operations_research::sat::IntegerEncoder::GetTrueLiteral" ()</dt><dd> \anchor _todo001690 (user): Make sure we abort right away on unsat!
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#a7c648e8ec1bcd260e3d4ed64b293bb28 "operations_research::sat::IntegerEncoder::ReserveSpaceForNumVariables" (int num_vars)</dt><dd> \anchor _todo001657 (user): Reserve vector index by literals? It is trickier, as we might not
know beforehand how many we will need. Consider alternatives to not waste
space like using dequeue.
</dd> <dt>
\_setscope operations_research::sat::IntegerEncoder Member \_internalref classoperations__research_1_1sat_1_1IntegerEncoder#a59abe9efe4246f146066483c1955e602 "operations_research::sat::IntegerEncoder::VariableIsFullyEncoded" (IntegerVariable var) const</dt><dd> \anchor _todo001660 (user): Cache result as long as equality_by_var_[index] is unchanged?
It might not be needed since if the variable is not fully encoded, then
PartialDomainEncoding() will filter unreachable values, and so the size
check will be false until further value have been encoded.
<p> \anchor _todo001661 (user): Comparing the size might be enough, but we want to be always
valid even if either (*domains_[var]) or PartialDomainEncoding(var) are
not properly synced because the propagation is not finished.
</dd> <dt>
\_setscope operations_research::sat::IntegerRoundingCutHelper Member \_internalref classoperations__research_1_1sat_1_1IntegerRoundingCutHelper#a55348bee0f2fe5505e28cc64ddfb1404 "operations_research::sat::IntegerRoundingCutHelper::ComputeCut" (RoundingOptions options, const CutData &base_ct, ImpliedBoundsProcessor *ib_processor=nullptr)</dt><dd> \anchor _todo001527 (user): It is still unclear if we have a * X + b * (1 - X) <= rhs
for a Boolean X, what is the best way to apply f and if we should merge
the terms. If there is no other terms, best is probably
f(rhs - a) * X + f(rhs - b) * (1 - X).
<p> \anchor _todo001526 (user): Avoid quadratic algorithm? Note that we are quadratic in
relevant positions not the full cut size, but this is still too much on
some problems.
<p> \anchor _todo001525 (user): If the rhs is small and close to zero, we might want to
consider different way of complementing the variables.
<p> \anchor _todo001522 (user): This is slow, 50% of run time on a2c1s1.pb.gz. Optimize!
<p> \anchor _todo001523 (user): We assume that this is called with and without the option
use_ib_before_heuristic, so that we can abort if no IB has been applied
since then we will redo the computation. This is not really clean.
<p> \anchor _todo001524 (user): Experiment for the best value of this initial violation
threshold. Note also that we use the l2 norm on the restricted position
here. Maybe we should change that? On that note, the L2 norm usage seems
a bit weird to me since it grows with the number of term in the cut. And
often, we already have a good cut, and we make it stronger by adding
extra terms that do not change its activity.</dd> <dt>
\_setscope operations_research::sat::IntegerSearchHelper Member \_internalref classoperations__research_1_1sat_1_1IntegerSearchHelper#ac2d4796c1f43982c5c9f31174be82908 "operations_research::sat::IntegerSearchHelper::GetDecision" (const std::function< BooleanOrIntegerLiteral()> &f, LiteralIndex *decision)</dt><dd> \anchor _todo001753 (user): It would be nicer if this can never happen. For now, it
does because of the Propagate() not reaching the fixed point as
mentioned in a<p> \anchor _todo001754 <p> \anchor _todo001755 above. As a work-around, we display a message
but do not crash and recall the decision heuristic.
<p> \anchor _todo001752 (user): Ideally it would be cool to delay the creation even more
until we have a conflict with these decisions, but it is currently
hard to do so.
</dd> <dt>
\_setscope operations_research::sat::IntegerSearchHelper Member \_internalref classoperations__research_1_1sat_1_1IntegerSearchHelper#aee604e664f5122db61cd4c73f437be2a "operations_research::sat::IntegerSearchHelper::SolveIntegerProblem" ()</dt><dd> \anchor _todo001757 (user): We have the issue that at level zero. calling the propagation
loop more than once can propagate more! This is because we call the LP
again and again on each level zero propagation. This is causing some
CHECKs() to fail in multithread (rarely) because when we associate new
literals to integer ones, Propagate() is indirectly called. Not sure yet
how to fix.
<p> \anchor _todo001758 (user): Experiment more around dynamically changing the
threshold for storing LP solutions in the pool. Alternatively expose
this as parameter so this can be tuned later.<p> \anchor _todo001759 (user): Avoid adding the same solution many time if the LP didn't
change. Avoid adding solution that are too deep in the tree (most
variable fixed). Also use a callback rather than having this here, we
don't want this file to depend on cp_model.proto.
</dd> <dt>
\_setscope operations_research::sat::IntegerSearchHelper Member \_internalref classoperations__research_1_1sat_1_1IntegerSearchHelper#a2e2faa726399df6f91e4dc89d9ed5117 "operations_research::sat::IntegerSearchHelper::TakeDecision" (Literal decision)</dt><dd> \anchor _todo001756 (user): on some problems, this function can be quite long. Expand
so that we can check the time limit at each step?
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#a528e39b17cbbdccc58f61b4db9fd4141 "operations_research::sat::IntegerTrail::AppendNewBoundsFrom" (int base_index, std::vector< IntegerLiteral > *output) const</dt><dd> \anchor _todo001675 (user): Implement a dense version if there is more trail entries
than variables!
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#a07f3c5bf9ad7390cb25efb3f6a0de3b3 "operations_research::sat::IntegerTrail::ConditionalEnqueue" (Literal lit, IntegerLiteral i_lit, std::vector< Literal > *literal_reason, std::vector< IntegerLiteral > *integer_reason)</dt><dd> \anchor _todo001667 (user): We could even keep the reason and maybe do some reasoning using
at_least_one constraint on a set of the Boolean used here.
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#aa5f3f24dfc832d45939478360f2a9ef1 "operations_research::sat::IntegerTrail::Enqueue" (IntegerLiteral i_lit, absl::Span< const Literal > literal_reason, absl::Span< const IntegerLiteral > integer_reason)</dt><dd> \anchor _todo001696 (user): If the given bound is equal to the current bound, maybe the new
reason is better? how to decide and what to do in this case? to think about
it. Currently we simply don't do anything.
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#ae5d98735536061f5c38f91ddd6a0b073 "operations_research::sat::IntegerTrail::Enqueue" (IntegerLiteral i_lit, absl::Span< const Literal > literal_reason, absl::Span< const IntegerLiteral > integer_reason, int trail_index_with_same_reason)</dt><dd> \anchor _todo001697 (user): This currently cannot refer to a trail_index with a lazy
reason. Fix or at least check that this is the case.
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#ae3ea8da78f7a6ec038887174bbad6ceb "operations_research::sat::IntegerTrail::Propagate" (Trail *trail) final</dt><dd> \anchor _todo001665 (user): refactor the interaction IntegerTrail <-> IntegerEncoder so
that we can just push right away such literal. Unfortunately, this is is
a big chunk of work.
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#a090881ffd3442b49e6e858dd6cc9f433 "operations_research::sat::IntegerTrail::Reason" (const Trail &trail, int trail_index) const final</dt><dd> \anchor _todo001674 (user): If this is called many time on the same variables, it could be
made faster by using some caching mechanism.
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#a3f82268fd6c91332511a3d8765d6d07f "operations_research::sat::IntegerTrail::RelaxLinearReason" (IntegerValue slack, absl::Span< const IntegerValue > coeffs, std::vector< IntegerLiteral > *reason) const</dt><dd> \anchor _todo001693 (user): Requiring all initial literal to be at their current bound is
not really clean. Maybe we can change the API to only take IntegerVariable
and produce the reason directly.<p> \anchor _todo001694 (user): change API so that this work is performed during the conflict
analysis where we can be smarter in how we relax the reason. Note however
that this function is mainly used when we have a conflict, so this is not
really high priority.<p> \anchor _todo001695 (user): Test that the code work in the presence of integer overflow.
<p> \anchor _todo001666 (user): Get rid of this function and only keep the trail index one?
</dd> <dt>
\_setscope operations_research::sat::IntegerTrail Member \_internalref classoperations__research_1_1sat_1_1IntegerTrail#a86dbd554c727e96c1ce6e33a54a73235 "operations_research::sat::IntegerTrail::UpdateInitialDomain" (IntegerVariable var, Domain domain)</dt><dd> \anchor _todo001692 (user): There is some memory inefficiency if this is called many time
because of the underlying data structure we use. In practice, when used
with a presolve, this is not often used, so that is fine though.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4f8e9410f7631560e2efea8f401e5aa1 "operations_research::sat::IntegerValueSelectionHeuristic" (std::function< BooleanOrIntegerLiteral()> var_selection_heuristic, Model *model)</dt><dd> \anchor _todo001732 (user): Experiment more with value selection heuristics.
</dd> <dt>
\_setscope operations_research::sat::IntervalsRepository Member \_internalref classoperations__research_1_1sat_1_1IntervalsRepository#a62f30977af214764af573b8a9da295d6 "operations_research::sat::IntervalsRepository::CreateDisjunctivePrecedenceLiteral" (IntervalVariable a, IntervalVariable b)</dt><dd> \anchor _todo001766 (user): also add the reverse like start_b + 1 <= end_a if negated?
</dd> <dt>
\_setscope operations_research::sat::IntervalsRepository Member \_internalref classoperations__research_1_1sat_1_1IntervalsRepository#a89d4a8a4b1575bb7a0d793402c82e099 "operations_research::sat::IntervalsRepository::CreatePrecedenceLiteral" (IntervalVariable a, IntervalVariable b)</dt><dd> \anchor _todo001767 (user): Also add {{y_plus_one, x}, x_before_y.Negated()} ?
</dd> <dt>
\_setscope operations_research::sat::IntervalsRepository Member \_internalref classoperations__research_1_1sat_1_1IntervalsRepository#ae9f8653f78ec2416053ba12305b3b2a7 "operations_research::sat::IntervalsRepository::GetOrCreateHelper" (const std::vector< IntervalVariable > &variables, bool register_as_disjunctive_helper=false)</dt><dd> \anchor _todo001768 (user): Ideally we should sort the vector of variables, but right now
we cannot since we often use this with a parallel vector of demands. So this
"sorting" should happen in the presolver so we can share as much as possible.
</dd> <dt>
\_setscope operations_research::sat::LbTreeSearch Class \_internalref classoperations__research_1_1sat_1_1LbTreeSearch "operations_research::sat::LbTreeSearch" </dt><dd> \anchor _todo001799 (user): What this is doing is really similar to asking a SAT solver if
the current objective lower bound is reachable by solving a SAT problem.
However, this code handle on the side all the "conflict" of the form
objective > current_lb. As a result, when it is UNSAT, we can bump the lower
bound by a bigger amount than one. We also do not completely loose everything
learned so far for the next iteration.
</dd> <dt>
\_setscope operations_research::sat::LbTreeSearch Member \_internalref classoperations__research_1_1sat_1_1LbTreeSearch#ab578e3dd57e9e2c0daff912371d19dc2 "operations_research::sat::LbTreeSearch::LbTreeSearch" (Model *model)</dt><dd> \anchor _todo001783 (user): if we have many independent LP, this will find nothing.
<p> \anchor _todo001782 (user): Starts with an initial variable score for all variable in
the objective at their minimum value? this should emulate the first step of
the core approach and gives a similar bound.
</dd> <dt>
\_setscope operations_research::sat::LbTreeSearch Member \_internalref classoperations__research_1_1sat_1_1LbTreeSearch#ab5eed5bfd114852c086831f49823d8ba "operations_research::sat::LbTreeSearch::Search" (const std::function< void()> &feasible_solution_observer)</dt><dd> \anchor _todo001784 (user): a strong branching initial start, or allowing a few decision
per nodes might be a better approach.<p> \anchor _todo001785 (user): It would also be cool to exploit the reason for the LB increase
even more.
<p> \anchor _todo001786 (user): No point checking that if the objective lb wasn't
assigned at this level.<p> \anchor _todo001787 (user): Exploit the reasons further.
<p> \anchor _todo001795 (user): We could do all at once rather than in O(#decision * #size).
<p> \anchor _todo001794 (user): Uses old optimal constraint that we just potentially
backtracked over?<p> \anchor _todo001793 (user): Try to minimize the number of decisions?
<p> \anchor _todo001792 (user): We sometimes branch on the objective variable, this should
probably be avoided.
<p> \anchor _todo001791 (user): In multithread, this change the behavior a lot since we
dive until we beat the best shared bound. Maybe we shouldn't do that.
<p> \anchor _todo001790 (user): If we have new information and our current objective bound
is higher than any bound in a whole subtree, we might want to just
restart this subtree exploration?
<p> \anchor _todo001789 (user): If we remember how far we can backjump for both true/false
branch, we could be more efficient.
<p> \anchor _todo001788 (user): This is slightly different than bumping each time we
push a decision that result in an LB increase. This is also called on
backjump for instance.
</dd> <dt>
\_setscope operations_research::sat::LevelZeroEquality Member \_internalref classoperations__research_1_1sat_1_1LevelZeroEquality#a6f4c89def00ad8b950b31383f59ba094 "operations_research::sat::LevelZeroEquality::Propagate" () final</dt><dd> \anchor _todo001708 (user): We could go even further than just the GCD, and do more
arithmetic to tighten the target bounds. See for instance a problem like
ej.mps.gz that we don't solve easily, but has just 3 variables! the goal is
to minimize X, given 31013 X - 41014 Y - 51015 Z = -31013 (all >=0, Y and Z
bounded with high values). I know some MIP solvers have a basic linear
diophantine equation support.
<p> \anchor _todo001709 (user): Once the GCD is not 1, we could at any level make sure the
objective is of the correct form. For now, this only happen in a few
miplib problem that we close quickly, so I didn't add the extra code yet.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a18679d8902d037df4ad5371ab25ad435 "operations_research::sat::LinearBooleanProblemToCnfString" (const LinearBooleanProblem &problem)</dt><dd> \anchor _todo001033 (user): implement this trick.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintBuilder Class \_internalref classoperations__research_1_1sat_1_1LinearConstraintBuilder "operations_research::sat::LinearConstraintBuilder" </dt><dd> \anchor _todo001803 (user): Rename to LinearExpressionBuilder?
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintBuilder Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintBuilder#ae7f3237b747cd3a0ae75daf2f77e19d8 "operations_research::sat::LinearConstraintBuilder::AddDecomposedProduct" (absl::Span< const LiteralValueValue > product)</dt><dd> \anchor _todo001800 (user): Checks the value of literals.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintBuilder Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintBuilder#a00685724ff7957bd0b8dbb337b2eacd6 "operations_research::sat::LinearConstraintBuilder::AddQuadraticLowerBound" (AffineExpression left, AffineExpression right, IntegerTrail *integer_trail, bool *is_quadratic=nullptr)</dt><dd> \anchor _todo001805 (user): We could use (max - delta) instead of (min + delta) for each
expression instead. This would depend on the LP value of the left and
right.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintBuilder Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintBuilder#a2b9598a931a588949a8b5f5af8304ead "operations_research::sat::LinearConstraintBuilder::Build" ()</dt><dd> \anchor _todo001806 (user): this doesn't invalidate the builder object, but if one wants
to do a lot of dynamic editing to the constraint, then then underlying
algorithm needs to be optimized for that.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintBuilder Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintBuilder#a029e8c7ac32054484a98093c2ad7629a "operations_research::sat::LinearConstraintBuilder::LinearConstraintBuilder" ()</dt><dd> \anchor _todo001804 (user): Have a subclass so we can enforce that a caller using
AddLiteralTerm() must construct the Builder with an encoder.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintManager Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintManager#a7ed5d2e7a9f57fe18d3962de8ee08815 "operations_research::sat::LinearConstraintManager::AddCut" (LinearConstraint ct, std::string type_name, std::string extra_info="")</dt><dd> \anchor _todo001808 (user): We could prevent overflow by dividing more. Note that mainly
happen with super large variable domain since we usually restrict the size
of the generated coefficients in our cuts. So it shouldn't be that
important.
<p> \anchor _todo001809 (user): Use better heuristic here for detecting good cuts and mark
them undeletable.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintManager Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintManager#a6736aa5d3e7f0a44c29023b2bc85a453 "operations_research::sat::LinearConstraintManager::ChangeLp" (glop::BasisState *solution_state, int *num_new_constraints=nullptr)</dt><dd> \anchor _todo001816 (user): Experiment with different weights or different
functions for computing score.
<p> \anchor _todo001817 (user): Instead of comparing num_deletable_constraints with cut
limit, compare number of deletable constraints not in lp against the limit.
<p> \anchor _todo001815 (user): find better algo, this does 1000 * 4000 scalar product!
<p> \anchor _todo001814 (user): This blowup factor could be adaptative w.r.t. the constraint
limit.
<p> \anchor _todo001813 (user): Because we simplified this constraint, it is possible that
it is now a duplicate of another one. Merge them.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintManager::ConstraintInfo Member \_internalref structoperations__research_1_1sat_1_1LinearConstraintManager_1_1ConstraintInfo#a466661f3078984c94567ad58040edb6e "operations_research::sat::LinearConstraintManager::ConstraintInfo::inactive_count" </dt><dd> \anchor _todo001819 (user): This is the number of time the constraint was consecutively
inactive, and go up to 100 with the default param, so we could optimize
the space used more.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintManager::ConstraintInfo Member \_internalref structoperations__research_1_1sat_1_1LinearConstraintManager_1_1ConstraintInfo#abdf73acb15ffe53b95a4131d9ba9aac9 "operations_research::sat::LinearConstraintManager::ConstraintInfo::is_deletable" </dt><dd> \anchor _todo001821 (user): We can have a better heuristics. Some generated good cuts
can be marked undeletable and some unused problem specified constraints
can be marked deletable.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintManager::ConstraintInfo Member \_internalref structoperations__research_1_1sat_1_1LinearConstraintManager_1_1ConstraintInfo#af933df23d6da0e5b34f2f92696b70800 "operations_research::sat::LinearConstraintManager::ConstraintInfo::objective_parallelism_computed" </dt><dd> \anchor _todo001820 (user): Pack bool and in general optimize the memory of this class.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Class \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator "operations_research::sat::LinearConstraintPropagator< use_int128 >" </dt><dd> \anchor _todo001717 (user): When the variables are Boolean, use directly the pseudo-Boolean
constraint implementation. But we do need support for enforcement literals
there.
<p> \anchor _todo001716 (user): Explore tree structure to get a log(n) complexity.<p> \anchor _todo001715 (user): If one has many such constraint, it will be more efficient to
propagate all of them at once rather than doing it one at the time.<p> \anchor _todo001714 (user): Technically we could still have an int128 overflow since we
sum n terms that cannot overflow but can still be pretty close to the limit.
Make sure this never happens! For most problem though, because the variable
bounds will be smaller than 10^9, we are pretty safe.</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator#a53f0cc28cdfafb5721ce374d3c16a973 "operations_research::sat::LinearConstraintPropagator< use_int128 >::ConditionalLb" (IntegerLiteral integer_literal, IntegerVariable target_var) const</dt><dd> \anchor _todo001703 (user): If there is a conflict (negative slack) we can be more
precise.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator#abd5b6d0682d0018f82fdce4233f6f576 "operations_research::sat::LinearConstraintPropagator< use_int128 >::LinearConstraintPropagator" (LinearConstraint ct, Model *model)</dt><dd> \anchor _todo001702 (user): deal with this corner case.
<p> \anchor _todo001701 (user): Avoid duplication with other constructor.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator#ace49b8f6c8907a190c3aee7d359791fd "operations_research::sat::LinearConstraintPropagator< use_int128 >::LinearConstraintPropagator" (absl::Span< const Literal > enforcement_literals, absl::Span< const IntegerVariable > vars, absl::Span< const IntegerValue > coeffs, IntegerValue upper_bound, Model *model)</dt><dd> \anchor _todo001700 (user): deal with this corner case.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator#ae4ae154271da65071742b6a7dbe2d460 "operations_research::sat::LinearConstraintPropagator< use_int128 >::Propagate" () final</dt><dd> \anchor _todo001704 (user): If the new ub fall into an hole of the variable, we can
actually relax the reason more by computing a better slack.
<p> \anchor _todo001705 (user): this is never supposed to happen since if we didn't have a
conflict above, we should be able to reduce the upper bound. It might
indicate an issue with our Boolean <-> integer encoding.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator#afb899d80eaee9952f8076176b345ee15 "operations_research::sat::LinearConstraintPropagator< use_int128 >::PropagateAtLevelZero" ()</dt><dd> \anchor _todo001706 (user): Deal with enforcements. It is just a bit of code to read the
value of the literals at level zero.
</dd> <dt>
\_setscope operations_research::sat::LinearConstraintPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearConstraintPropagator#acb9913bc77648b9229d90f8ebc306939 "operations_research::sat::LinearConstraintPropagator< use_int128 >::RegisterWith" (GenericLiteralWatcher *watcher)</dt><dd> \anchor _todo001707 (user): if there is more than one, maybe we should watch more to
propagate a "conflict" as soon as only one is unassigned?
</dd> <dt>
\_setscope operations_research::sat::LinearIncrementalEvaluator Member \_internalref classoperations__research_1_1sat_1_1LinearIncrementalEvaluator#ad15e855847e8e9fd85eb17774c2fe277 "operations_research::sat::LinearIncrementalEvaluator::PrecomputeCompactView" (absl::Span< const int64_t > var_max_variation)</dt><dd> \anchor _todo001094 (user): We could delete them before. But at the time of this
optimization, I didn't want to change the behavior of the algorithm at all.
</dd> <dt>
\_setscope operations_research::sat::LinearIncrementalEvaluator Member \_internalref classoperations__research_1_1sat_1_1LinearIncrementalEvaluator#aed1038acba7b405fb9c01417e3a1f05f "operations_research::sat::LinearIncrementalEvaluator::SlopeBreakpoints" (int var, int64_t current_value, const Domain &var_domain) const</dt><dd> \anchor _todo001093 (user): Deal with holes?
</dd> <dt>
\_setscope operations_research::sat::LinearIncrementalEvaluator Member \_internalref classoperations__research_1_1sat_1_1LinearIncrementalEvaluator#a201fdc143b0a225b578f5a5d123ef53a "operations_research::sat::LinearIncrementalEvaluator::WeightedViolationDelta" (absl::Span< const double > weights, int var, int64_t delta) const</dt><dd> \anchor _todo001092 (user): We can safely abort early if we know that delta will be >= 0.
<p> <p>(user): Maybe we can compute an absolute value instead of removing
old_distance.
</dd> <dt>
\_setscope operations_research::sat::LinearModel Member \_internalref classoperations__research_1_1sat_1_1LinearModel#a8c594ce81043440f547bf1320674a829 "operations_research::sat::LinearModel::LinearModel" (const CpModelProto &model_proto)</dt><dd> \anchor _todo001823 (user): Deal with/Check double insertion.
<p> \anchor _todo001822 (user): Do we use the loader code to detect full encodings and
element encodings.
</dd> <dt>
\_setscope operations_research::sat::LinearProgrammingConstraint Member \_internalref classoperations__research_1_1sat_1_1LinearProgrammingConstraint#ac0030221b056d71c560de62bd9d57a09 "operations_research::sat::LinearProgrammingConstraint::IncrementalPropagate" (const std::vector< int > &watch_indices) override</dt><dd> \anchor _todo001834 (user): The saved lp solution is still valid given the current variable
bounds, so the LP optimal didn't change. However we might still want to add
new cuts or new lazy constraints?<p> \anchor _todo001835 (user): Propagate the last optimal_constraint? Note that we need
to be careful since the reversible int in IntegerSumLE are not registered.
However, because we delete "optimalconstraints" on backtrack, we might not
care.
</dd> <dt>
\_setscope operations_research::sat::LinearProgrammingConstraint Member \_internalref classoperations__research_1_1sat_1_1LinearProgrammingConstraint#ac305ae4d90e003c68c190a412f9879de "operations_research::sat::LinearProgrammingConstraint::LinearProgrammingConstraint" (Model *model, absl::Span< const IntegerVariable > vars)</dt><dd> \anchor _todo001824 (user): make SatParameters singleton too, otherwise changing them after
a constraint was added will have no effect on this class.
</dd> <dt>
\_setscope operations_research::sat::LinearProgrammingConstraint Member \_internalref classoperations__research_1_1sat_1_1LinearProgrammingConstraint#a7ff29ebe58aca89b537dc833cc1c45de "operations_research::sat::LinearProgrammingConstraint::Propagate" () override</dt><dd> \anchor _todo001863 (user): It seems the time we loose by not stopping early might be worth
it because we end up with a better explanation at optimality.
<p> \anchor _todo001864 (user): Refactor so that they are just normal cut generators?
</dd> <dt>
\_setscope operations_research::sat::LinearProgrammingConstraint Member \_internalref classoperations__research_1_1sat_1_1LinearProgrammingConstraint#a6f4001652e985a2165ad4d6602eae29b "operations_research::sat::LinearProgrammingConstraint::SetLevel" (int level) override</dt><dd> \anchor _todo001833 (user): Still try to add cuts/constraints though!
<p> \anchor _todo001832 <p> \anchor _todo001831 (user): Keep all optimal solution in the current branch?
</dd> <dt>
\_setscope operations_research::sat::LinearPropagator Class \_internalref classoperations__research_1_1sat_1_1LinearPropagator "operations_research::sat::LinearPropagator" </dt><dd> \anchor _todo001893 (user): This is a work in progress and is currently incomplete:
- Lack more incremental support for faster propag.
- Lack detection and propagation of at least one of these linear is true
which can be used to propagate more bound if a variable appear in all these
constraint.
</dd> <dt>
\_setscope operations_research::sat::LinearPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearPropagator#a6b4adf9e4a241637f5dee4cc9ea43adc "operations_research::sat::LinearPropagator::AddConstraint" (absl::Span< const Literal > enforcement_literals, absl::Span< const IntegerVariable > vars, absl::Span< const IntegerValue > coeffs, IntegerValue upper_bound)</dt><dd> \anchor _todo001879 (user): Shall we decide on some ordering here? maybe big coeff first
so that we get the largest change in slack? the idea being to propagate
large change first in case of cycles.
<p> \anchor _todo001877 (user): we still waste the space in coeffs_buffer_ so that the
start are aligned with the variables_buffer_.
<p> \anchor _todo001878 (user): With some care, when we cannot propagate or the
constraint is not enforced, we could leave in_queue_[] at true but
not put the constraint in the queue.
</dd> <dt>
\_setscope operations_research::sat::LinearPropagator Member \_internalref classoperations__research_1_1sat_1_1LinearPropagator#a615cc74a74066501e840dcc2343738ec "operations_research::sat::LinearPropagator::LinearPropagator" (Model *model)</dt><dd> \anchor _todo001876 (user): When we start to push too much (Cycle?) we should see what
other propagator says before repropagating this one, system for call
later?
</dd> <dt>
\_setscope operations_research::sat::Literal Member \_internalref classoperations__research_1_1sat_1_1Literal#a3b27485970070e73266f5530d2a7f55c "operations_research::sat::Literal::operator LiteralIndex" () const</dt><dd> \anchor _todo002124 (user): LiteralIndex might not even be needed, but because of the
signed value business, it is still safer with it.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a277ebf478f1fa693dd01867071080203 "operations_research::sat::LoadAndSolveCpModelForTest" (const CpModelProto &model_proto, Model *model)</dt><dd> \anchor _todo001463 (user): Clean this up.
Solves a CpModelProto without any processing. Only used for unit tests.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a0df7b56e0026b783deeeff20487de7cf "operations_research::sat::LoadBooleanProblem" (const LinearBooleanProblem &problem, SatSolver *solver)</dt><dd> \anchor _todo001032 (user): Currently, the sat solver can load without any issue
constraints with duplicate variables, so we just output a warning if the
problem is not "valid". Make this a strong check once we have some
preprocessing step to remove duplicates variable in the constraints.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a64c230730625662a2a2032da620b6c6e "operations_research::sat::LoadBooleanSymmetries" (const CpModelProto &model_proto, Model *m)</dt><dd> \anchor _todo001187 (user): We currently only have the code for Booleans, it is why we
currently ignore symmetries involving integer variables.
<p> \anchor _todo001169 (user): We could add these extra Boolean during expansion/presolve so
that we have the symmetry involing them. Or maybe comes up with a different
solution.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4b4da650bfcb86c00bee1df0ab0cc953 "operations_research::sat::LoadConditionalLinearConstraint" (const absl::Span< const Literal > enforcement_literals, const LinearConstraint &cst, Model *model)</dt><dd> \anchor _todo001722 (user): Remove the conversion!
<p> \anchor _todo001723 (user): Remove the conversion!
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ade08c3522dfce173ee1fd50fab3bd3c0 "operations_research::sat::LoadLinearConstraint" (const ConstraintProto &ct, Model *m)</dt><dd> \anchor _todo001184 (user): Reuse ComputeLinearBounds()? but then we need another loop
to detect if we only have Booleans.
<p> \anchor _todo001183 (user): Actually this should never be called since we process
linear1 in ExtractEncoding().
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a899896953b6215b01cb0b85caa96bebe "operations_research::sat::LoadLinearConstraint" (const LinearConstraint &cst, Model *model)</dt><dd> \anchor _todo001721 (user): Remove the conversion!
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ade08c3522dfce173ee1fd50fab3bd3c0 "operations_research::sat::LoadLinearConstraint" (const ConstraintProto &ct, Model *m)</dt><dd> \anchor _todo001185 (user): we should probably also implement an
half-reified version of this constraint.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a23861bab6341cfcfeeff90c2b3e3ab7e "operations_research::sat::LoadLinMaxConstraint" (const ConstraintProto &ct, Model *m)</dt><dd> \anchor _todo001186 (user): Consider replacing the min propagator by max.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a0f015dd7f088e0a586993ec925a94ced "operations_research::sat::LoadModelForProbing" (PresolveContext *context, Model *local_model)</dt><dd> \anchor _todo002069 (user): The model we load does not contain affine relations! But
ideally we should be able to remove all of them once we allow more complex
constraints to contains linear expression.<p> \anchor _todo002070 (user): remove code duplication with cp_model_solver. Here we also do
not run the heuristic to decide which variable to fully encode.<p> \anchor _todo002071 (user): Maybe do not load slow to propagate constraints? for instance
we do not use any linear relaxation here.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a47e5d5cb3e7eb43191d094fc4752b5c6 "operations_research::sat::LoadVariables" (const CpModelProto &model_proto, bool view_all_booleans_as_integers, Model *m)</dt><dd> \anchor _todo001168 (user): Fix the constant variable situation. An optional interval
with constant start/end or size cannot share the same constant
variable if it is used in non-optional situation.
</dd> <dt>
\_setscope operations_research::sat::LocalBranchingLpBasedNeighborhoodGenerator Member \_internalref classoperations__research_1_1sat_1_1LocalBranchingLpBasedNeighborhoodGenerator#aa12eefb1663a627e6519658d87dc3f19 "operations_research::sat::LocalBranchingLpBasedNeighborhoodGenerator::Generate" (const CpSolverResponse &initial_solution, double difficulty, absl::BitGenRef random) final</dt><dd> \anchor _todo001152 (user): Extend to integer variables.
</dd> <dt>
\_setscope operations_research::sat::LocalBranchingLpBasedNeighborhoodGenerator Member \_internalref classoperations__research_1_1sat_1_1LocalBranchingLpBasedNeighborhoodGenerator#a965d1a7c6cd024de0b2e7a9bf8642f30 "operations_research::sat::LocalBranchingLpBasedNeighborhoodGenerator::LocalBranchingLpBasedNeighborhoodGenerator" (NeighborhoodGeneratorHelper const *helper, absl::string_view name, std::function< void(CpModelProto, Model *)> solve_callback, ModelSharedTimeLimit *const global_time_limit)</dt><dd> \anchor _todo001167 (user): Restructure code so that we avoid circular dependency with
solving functions. For now, we use solve_callback.
</dd> <dt>
\_setscope operations_research::sat::LsEvaluator Class \_internalref classoperations__research_1_1sat_1_1LsEvaluator "operations_research::sat::LsEvaluator" </dt><dd> \anchor _todo001096 (user): Ideas for constraint generated moves or sequences of moves?
</dd> <dt>
\_setscope operations_research::sat::LsEvaluator Member \_internalref classoperations__research_1_1sat_1_1LsEvaluator#a55666b5aee7e751b4bc51f963c2fbaa3 "operations_research::sat::LsEvaluator::DeterministicTime" () const</dt><dd> \anchor _todo001097 (user): Properly account all big time consumers.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#af004193a12bf9ed78b295e7f7cb51e6f "operations_research::sat::MinimizeCore" (SatSolver *solver, std::vector< Literal > *core)</dt><dd> \anchor _todo002235 (user): One should use MinimizeCoreWithPropagation() instead.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4d6ba15542ec5d59958de53c92279b2a "operations_research::sat::MinimizeCoreWithPropagation" (TimeLimit *limit, SatSolver *solver, std::vector< Literal > *core)</dt><dd> \anchor _todo001977 (user): Avoid spending too much time trying to minimize a core.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a56ad40efdac4d337987b0ca306aa7bd6 "operations_research::sat::MinimizeCoreWithSearch" (TimeLimit *limit, SatSolver *solver, std::vector< Literal > *core)</dt><dd> \anchor _todo001952 (user): tune.
<p> \anchor _todo001953 (user): Properly use the node depth instead.
</dd> <dt>
\_setscope operations_research::sat::MinPropagator Class \_internalref classoperations__research_1_1sat_1_1MinPropagator "operations_research::sat::MinPropagator" </dt><dd> \anchor _todo001718 (user): Implement a more efficient algorithm when the need arise.
</dd> <dt>
\_setscope operations_research::sat::MinPropagator Member \_internalref classoperations__research_1_1sat_1_1MinPropagator#aa5ab4a97c4fe03823494846846b5accd "operations_research::sat::MinPropagator::Propagate" () final</dt><dd> \anchor _todo001710 (user): Not sure this code is useful since this will be detected
by the fact that the [lb, ub] of the min is empty. It depends on the
propagation order though, but probably the precedences propagator would
propagate before this one. So change this to a CHECK?
</dd> <dt>
\_setscope operations_research::sat::Model Member \_internalref classoperations__research_1_1sat_1_1Model#ad025b208280b29fc3cfe2b7d3d61c8f9 "operations_research::sat::Model::GetOrCreate" ()</dt><dd> \anchor _todo001950 (user): directly store std::unique_ptr<> in singletons_?
</dd> <dt>
\_setscope operations_research::sat::ModelCopy Member \_internalref classoperations__research_1_1sat_1_1ModelCopy#aa71276685b3bdc30f73c319014c8ce26 "operations_research::sat::ModelCopy::ImportAndSimplifyConstraints" (const CpModelProto &in_model, bool first_copy=false)</dt><dd> \anchor _todo001354 (user): Merge with the phase 1 of the presolve code.<p> \anchor _todo001357 (user): find a better way than copy then clear_name()?
<p> \anchor _todo001356 (user): if ignore_names is false, we should make sure the
name are properly copied by all these functions. Or we should never copy
name and have a separate if (!ignore_name) copy the name...
<p> \anchor _todo001355 (user): It seems easy to forget to update this if any new constraint
contains an interval or if we add a field to an existing constraint. Find a
way to remind contributor to not forget this.
</dd> <dt>
\_setscope operations_research::sat::ModelRandomGenerator Member \_internalref classoperations__research_1_1sat_1_1ModelRandomGenerator#a94be5f7295c63407b5efb55e55724391 "operations_research::sat::ModelRandomGenerator::LogSalt" () const</dt><dd> \anchor _todo002334 (user): I didn't find a cleaner way to log this.
</dd> <dt>
\_setscope operations_research::sat::MutableUpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1MutableUpperBoundedLinearConstraint#a4a9b63c72d02a80a8f76efbb0f020a3f "operations_research::sat::MutableUpperBoundedLinearConstraint::ClearAll" ()</dt><dd> \anchor _todo001987 (user): We could be more efficient and have only one loop here.
</dd> <dt>
\_setscope operations_research::sat::MutableUpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1MutableUpperBoundedLinearConstraint#a56db11b9d396d13e4cff87b74b086d81 "operations_research::sat::MutableUpperBoundedLinearConstraint::ComputeSlackForTrailPrefix" (const Trail &trail, int trail_index) const</dt><dd> \anchor _todo001989 (user): Keep this for DCHECK(), but maintain the slack incrementally
instead of recomputing it.
</dd> <dt>
\_setscope operations_research::sat::MutableUpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1MutableUpperBoundedLinearConstraint#a467eaf21318efb233670a0035a2eae34 "operations_research::sat::MutableUpperBoundedLinearConstraint::ReduceCoefficients" ()</dt><dd> \anchor _todo001988 (user): Also reduce the trivially false literal when coeff > rhs_ ?
</dd> <dt>
\_setscope operations_research::sat::MutableUpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1MutableUpperBoundedLinearConstraint#a2d8ea04aaae8c892a39770e35eced029 "operations_research::sat::MutableUpperBoundedLinearConstraint::ReduceCoefficientsAndComputeSlackForTrailPrefix" (const Trail &trail, int trail_index)</dt><dd> \anchor _todo002003 (user): Ideally the slack should be maitainable incrementally.
</dd> <dt>
\_setscope operations_research::sat::Neighborhood Member \_internalref structoperations__research_1_1sat_1_1Neighborhood#a9d77507f928ca9524da987bfbf75eee8 "operations_research::sat::Neighborhood::id" </dt><dd> \anchor _todo001162 (user): Make sure that the id is unique for each generated
neighborhood for each generator.
</dd> <dt>
\_setscope operations_research::sat::NeighborhoodGenerator Member \_internalref classoperations__research_1_1sat_1_1NeighborhoodGenerator#ac8a7ed70ccae23b555deecf09756273f "operations_research::sat::NeighborhoodGenerator::Synchronize" ()</dt><dd> \anchor _todo001147 (user): experiment with resetting the time limit if a solution is
found.
<p> \anchor _todo001146 (user): Weight more recent data.
degrade the current average to forget old learnings.
</dd> <dt>
\_setscope operations_research::sat::NeighborhoodGeneratorHelper Member \_internalref classoperations__research_1_1sat_1_1NeighborhoodGeneratorHelper#a4853fe1b4ccd3d76f67706efd11a0698 "operations_research::sat::NeighborhoodGeneratorHelper::FixGivenVariables" (const CpSolverResponse &base_solution, const absl::flat_hash_set< int > &variables_to_fix) const</dt><dd> \anchor _todo001145 (user): force better objective? Note that this is already done when the
hint above is successfully loaded (i.e. if it passes the presolve
correctly) since the solver will try to find better solution than the
current one.
<p> \anchor _todo001142 (user): Maybe relax all variables in the objective when the number
is small or negligible compared to the number of variables.
<p> \anchor _todo001143 (user): If there is just one component, we can skip some computation.
<p> \anchor _todo001144 (user): We could handle some complex domain (size > 2).
</dd> <dt>
\_setscope operations_research::sat::NeighborhoodGeneratorHelper Member \_internalref classoperations__research_1_1sat_1_1NeighborhoodGeneratorHelper#aca0952c56878d9ecc6a8557bd42d170e "operations_research::sat::NeighborhoodGeneratorHelper::GetSchedulingPrecedences" (const absl::flat_hash_set< int > &ignored_intervals, const CpSolverResponse &initial_solution, absl::BitGenRef random) const</dt><dd> \anchor _todo001140 (user): We could scan for model precedences and add them to the list
of precedences. This could enable more simplifications in the transitive
reduction phase.
<p> \anchor _todo001141 (user): Reduce precedence graph
</dd> <dt>
\_setscope operations_research::sat::NeighborhoodGeneratorHelper Member \_internalref classoperations__research_1_1sat_1_1NeighborhoodGeneratorHelper#aebc02302feafecf7907a5fcc097b7486 "operations_research::sat::NeighborhoodGeneratorHelper::graph_mutex_" </dt><dd> \anchor _todo001163 (user): Refactor the class to be thread-safe instead, it should be
safer and more easily maintainable. Some complication with accessing the
variable<->constraint graph efficiently though.
</dd> <dt>
\_setscope operations_research::sat::NeighborhoodGeneratorHelper Member \_internalref classoperations__research_1_1sat_1_1NeighborhoodGeneratorHelper#a83668c50ed54cfcd6b559374579eeca7 "operations_research::sat::NeighborhoodGeneratorHelper::Synchronize" () override</dt><dd> \anchor _todo001127 (user): We could set the optional literal to false directly in
the bound sharing manager. We do have to be careful that all the
different solvers have the same optionality definition though.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a8778e9db6fac31eddd2d7308e11e30df "operations_research::sat::NewSatParameters" )(const std::string ¶ms)</dt><dd> \anchor _todo001404 (user): Support it on android.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4bd54ab16ebc1bd6fa80d1e23ab79adc "operations_research::sat::NewSatParameters" (const sat::SatParameters ¶meters)</dt><dd> \anchor _todo001405 (user): A notable exception to this is the TimeLimit which is
currently not initializing itself from the SatParameters in the model. It
will also starts counting from the time of its creation. It will be good
to find a solution that is less error prone.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2de97100bfce300a12937775dd890a59 "operations_research::sat::NewWeightedSum" )(const VectorInt &coefficients, const std::vector< IntegerVariable > &vars)</dt><dd> \anchor _todo001726 (user): invert the coefficients/vars arguments.
<p> \anchor _todo001727 (user): deal with overflow here too!
</dd> <dt>
\_setscope operations_research::sat::NoCyclePropagator Member \_internalref classoperations__research_1_1sat_1_1NoCyclePropagator#a8114b6f2c07e82698969a873461784ec "operations_research::sat::NoCyclePropagator::NoCyclePropagator" (int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< Literal > &literals, Model *model)</dt><dd> \anchor _todo001042 (user): Uniformize this across propagator. Sometimes it is nice not
to register them, but most of them can be registered right away.
</dd> <dt>
\_setscope operations_research::sat::NoCyclePropagator Member \_internalref classoperations__research_1_1sat_1_1NoCyclePropagator#a0751bd29114a60910d7626a21eb88b94 "operations_research::sat::NoCyclePropagator::Propagate" () final</dt><dd> \anchor _todo001043 (user): only explore node with newly added arcs.<p> \anchor _todo001044 (user): We could easily re-index the graph so that only nodes with arcs
are used. Because right now we are in O(num_nodes) even if the graph is
empty.
<p> \anchor _todo001045 (user): We could be more efficient here, but this is only executed on
conflicts. We should at least make sure we return a single cycle even
though if this is called often enough, we shouldn't have a lot more than
this.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7ab66b40d6b1168f1a5a47fcf16636ac "operations_research::sat::NonDeterministicLoop" (std::vector< std::unique_ptr< SubSolver > > &subsolvers, const int num_threads)</dt><dd> \anchor _todo002279 (user): We could also directly register callback to set stopping
Boolean to false in a few places.
</dd> <dt>
\_setscope operations_research::sat::NonOverlappingRectanglesEnergyPropagator Member \_internalref classoperations__research_1_1sat_1_1NonOverlappingRectanglesEnergyPropagator#a62a25736327376f2887d657c9885ee4b "operations_research::sat::NonOverlappingRectanglesEnergyPropagator::Propagate" () final</dt><dd> \anchor _todo001570 (user): double-check/revisit the algo for box of variable sizes.
</dd> <dt>
\_setscope operations_research::sat::ObjectiveEncoder Member \_internalref classoperations__research_1_1sat_1_1ObjectiveEncoder#aba8bf46b2a10fabd82ffd3dbf2f0e174 "operations_research::sat::ObjectiveEncoder::nodes" () const</dt><dd> \anchor _todo001619 (user): Remove mutable version once refactoring is done.
</dd> <dt>
\_setscope operations_research::sat::ObjectiveEncoder Member \_internalref classoperations__research_1_1sat_1_1ObjectiveEncoder#aea57787b48ca659a4962d5b674a72762 "operations_research::sat::ObjectiveEncoder::ProcessCore" (absl::Span< const Literal > core, Coefficient min_weight, Coefficient gap, std::string *info)</dt><dd> \anchor _todo001616 (user): this node is closed and can be removed from the core.
<p> \anchor _todo001617 (user): If assignment.LiteralIsTrue(bool_nodes[j]) We can
minimize the core here by removing bool_nodes[i] from it. Note
however that since we already minimized the core, this is
unlikely to happen.
<p> \anchor _todo001618 (user): If we infered the exactly one from the binary implication
graph, there is no need to add the amo since it is already there.
<p> \anchor _todo001615 (user): propagate proper ub first.
</dd> <dt>
\_setscope operations_research::sat::PbConstraints Member \_internalref classoperations__research_1_1sat_1_1PbConstraints#a09190309faf157e3b7187403cfcb514c "operations_research::sat::PbConstraints::AddConstraint" (const std::vector< LiteralWithCoeff > &cst, Coefficient rhs, Trail *trail)</dt><dd> \anchor _todo001995 (user): This is relatively slow. Take the "transpose" all at once, and
maybe put small constraints first on the to_update_ lists.
<p> \anchor _todo001996 (user): the index is needed to give the correct thresholds_ entry
to InitializeRhs() below, but this linear scan is not super
efficient.
</dd> <dt>
\_setscope operations_research::sat::PbConstraints Member \_internalref classoperations__research_1_1sat_1_1PbConstraints#a9474a3e975c9c26b00740c514d82c373 "operations_research::sat::PbConstraints::BumpActivity" (UpperBoundedLinearConstraint *constraint)</dt><dd> \anchor _todo002008 (user): Remove duplication with other activity update functions.
</dd> <dt>
\_setscope operations_research::sat::PbConstraints Member \_internalref classoperations__research_1_1sat_1_1PbConstraints#a38e94ac484dcbd409e942d4e6f51d585 "operations_research::sat::PbConstraints::ClearConflictingConstraint" ()</dt><dd> \anchor _todo002007 (user): This is a hack to get the PB conflict, because the rest of
the solver API assume only clause conflict. Find a cleaner way?
</dd> <dt>
\_setscope operations_research::sat::PostsolveClauses Struct \_internalref structoperations__research_1_1sat_1_1PostsolveClauses "operations_research::sat::PostsolveClauses" </dt><dd> \anchor _todo002192 (user): Use a flat memory structure instead.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a1951d3606d9c0c92204c310b911bf0e7 "operations_research::sat::PostsolveLinear" (const ConstraintProto &ct, std::vector< Domain > *domains)</dt><dd> \anchor _todo001191 (user): I am not 100% that the algo here might cover all the presolve
case, so if this fail, it might indicate an issue here and not in the
presolve/solver code.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a3e2be878d255ed853ce6a36d52c899dd "operations_research::sat::PostsolveResponse" (const int64_t num_variables_in_original_model, const CpModelProto &mapping_proto, const std::vector< int > &postsolve_mapping, std::vector< int64_t > *solution)</dt><dd> \anchor _todo001192 (user): We could use the search strategy to fix free variables to some
chosen values? The feature might never be needed though.
</dd> <dt>
\_setscope operations_research::sat::PrecedenceRelations Class \_internalref classoperations__research_1_1sat_1_1PrecedenceRelations "operations_research::sat::PrecedenceRelations" </dt><dd> \anchor _todo002046 (user): Support conditional relation.
<p> <p>(user): Support non-DAG like graph.
<p> <p>(user): Support variable offset that can be updated as search progress.
</dd> <dt>
\_setscope operations_research::sat::PrecedenceRelations Member \_internalref classoperations__research_1_1sat_1_1PrecedenceRelations#ae6ba26762d06d3260f9974270d02375b "operations_research::sat::PrecedenceRelations::Add" (IntegerVariable tail, IntegerVariable head, IntegerValue offset)</dt><dd> \anchor _todo002012 (user): if tail = Negation(head) also update Domain.
<p> \anchor _todo002010 (user): Return infeasible if tail == head and offset > 0.
<p> \anchor _todo002011 <p> \anchor _todo002013 (user): Alternatively, force caller to do a Resize().
</dd> <dt>
\_setscope operations_research::sat::PrecedenceRelations Member \_internalref classoperations__research_1_1sat_1_1PrecedenceRelations#a95dab1b3432098f1e966ec42fb3a26f3 "operations_research::sat::PrecedenceRelations::Build" ()</dt><dd> \anchor _todo002014 (user): Support negative offset?<p> \anchor _todo002016 (user): Only explore the sub-graph reachable from "vars".
<p> \anchor _todo002015 (user): This can fail if we don't have a DAG. We could just skip Bad
edges instead, and have a sub-DAG as an heuristic. Or analyze the arc
weight and make sure cycle are not an issue. We can also start with arcs
with strictly positive weight.<p> \anchor _todo002052 (user): Be more dynamic as we start to add relations during search.
<p> \anchor _todo002017 (user): Also do that if we don't have a DAG?
</dd> <dt>
\_setscope operations_research::sat::PrecedenceRelations Member \_internalref classoperations__research_1_1sat_1_1PrecedenceRelations#af1bbb310cdf18b3d7faad6e15f99bbca "operations_research::sat::PrecedenceRelations::ComputeFullPrecedences" (const std::vector< IntegerVariable > &vars, std::vector< FullIntegerPrecedence > *output)</dt><dd> \anchor _todo002019 (user): optimize when needed.
<p> \anchor _todo002051 (user): Many relations can be redundant. Filter them.
<p> \anchor _todo002050 (user): Since we don't need ALL precedences, we could just work on a
sub-DAG of the full precedence graph instead of aborting. Or we can just
support the general non-DAG cases.<p> \anchor _todo002049 (user): Put some work limit in place, as this can be slow. Complexity
is in O(vars.size()) * num_arcs.<p> \anchor _todo002048 (user): generalize.<p> \anchor _todo002020 (user): Release the memory right away.
<p> \anchor _todo002018 (user): use vector of fixed size.
</dd> <dt>
\_setscope operations_research::sat::PrecedencesPropagator Class \_internalref classoperations__research_1_1sat_1_1PrecedencesPropagator "operations_research::sat::PrecedencesPropagator" </dt><dd> \anchor _todo002047 (user): We could easily generalize the code to support any relation of
the form a*X + b*Y + c*Z >= rhs (or <=). Do that since this class should be
a lot faster at propagating small linear inequality than the generic
propagator and the overhead of supporting coefficient should not be too bad.
</dd> <dt>
\_setscope operations_research::sat::PrecedencesPropagator Member \_internalref classoperations__research_1_1sat_1_1PrecedencesPropagator#a3a76b9c2a7fae816a7bf98ceb157c658 "operations_research::sat::PrecedencesPropagator::AddGreaterThanAtLeastOneOfConstraints" (Model *model)</dt><dd> \anchor _todo002045 (user): This does not take into account clause of size 2 since they
are stored in the BinaryImplicationGraph instead. Some ideas specific
to size 2:
- There can be a lot of such clauses, but it might be nice to consider
them. we need to experiments.
- The automatic clause detection might be a better approach and it
could be combined with probing.
<p> \anchor _todo002044 (user): Do more extensive experiment. Remove the second approach as
it is more time consuming? or identify when it make sense. Note that the
first approach also allows to use "incomplete" at least one between arcs.
<p> \anchor _todo002053 (user): This can be quite slow, add some kind of deterministic limit
so that we can use it all the time.
</dd> <dt>
\_setscope operations_research::sat::PrecedencesPropagator Member \_internalref classoperations__research_1_1sat_1_1PrecedencesPropagator#a15a72ea359f6b0297496d690fb35d81a "operations_research::sat::PrecedencesPropagator::AddPrecedenceWithOffsetIfNew" (IntegerVariable i1, IntegerVariable i2, IntegerValue offset)</dt><dd> \anchor _todo002030 (user): Modify arc in place!
</dd> <dt>
\_setscope operations_research::sat::PrecedencesPropagator Member \_internalref classoperations__research_1_1sat_1_1PrecedencesPropagator#a21632ee0a6911bfee9b9cac2cc739584 "operations_research::sat::PrecedencesPropagator::ComputePrecedences" (const std::vector< IntegerVariable > &vars, std::vector< IntegerPrecedences > *output)</dt><dd> \anchor _todo002025 (user): use an order that is always topological? This is not clear
since it may be slower to compute and not worth it because the order below
is more natural and may work better.
<p> \anchor _todo002024 (user): it seems better to ignore negative min offset as we will
often have relation of the form interval_start >= interval_end -
offset, and such relation are usually not useful. Revisit this in case
we see problems where we can propagate more without this test.
</dd> <dt>
\_setscope operations_research::sat::PrecedencesPropagator Member \_internalref classoperations__research_1_1sat_1_1PrecedencesPropagator#acd56eb01eb354e825014a18a6f2ed1fd "operations_research::sat::PrecedencesPropagator::GetConditionalOffset" (IntegerVariable a, IntegerVariable b)</dt><dd> \anchor _todo002054 (user): Support list of literals, it isn't that much harder.
</dd> <dt>
\_setscope operations_research::sat::PrecedencesPropagator Member \_internalref classoperations__research_1_1sat_1_1PrecedencesPropagator#a68e6ed997752f220d4571c5faa136ce5 "operations_research::sat::PrecedencesPropagator::Propagate" () final</dt><dd> \anchor _todo002021 (user): Because of our code to deal with InPropagationLoop(), this is
not always true. Find a cleaner way to DCHECK() while not failing in this
corner case.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7a3e424a9963561cbd837b7a293b416e "operations_research::sat::PresolveBooleanLinearExpression" (std::vector< Literal > *literals, std::vector< Coefficient > *coefficients, Coefficient *offset)</dt><dd> \anchor _todo001978 (user): Merge this with similar code like
ComputeBooleanLinearExpressionCanonicalForm().
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a5670894aad056fc4452807432b031858 "operations_research::sat::PresolveContext::AddImplyInDomain" (int b, int x, const Domain &domain)</dt><dd> \anchor _todo002058 (user): Find the best way to create such small proto.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a0e57a4d478e6619ec142e1c0e3da51a3 "operations_research::sat::PresolveContext::CanonicalizeObjective" (bool simplify_domain=true)</dt><dd> \anchor _todo002066 (user): This is a bit duplicated with the presolve linear code.
We also do not propagate back any domain restriction from the objective to
the variables if any.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a2ccc5bf972c4cfe911eb430e97dd3c57 "operations_research::sat::PresolveContext::CanonicalizeVariable" (int ref)</dt><dd> \anchor _todo002075 (user): When we can always get rid of affine relation, it might be good
to do a final pass to canonicalize all domains in a model after presolve.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#acfa9e96fd82123e73419f70c85690153 "operations_research::sat::PresolveContext::ConstraintVariableUsageIsConsistent" ()</dt><dd> \anchor _todo002060 (user): Also test var_to_constraints_ !!
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#ae773a841f916d3caf1eb74caf23aa43b "operations_research::sat::PresolveContext::InsertVarValueEncoding" (int literal, int ref, int64_t value)</dt><dd> \anchor _todo002076 (user): This function is not always correct if
!context->DomainOf(ref).contains(value), we could make it correct but it
might be a bit expansive to do so. For now we just have a DCHECK().
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a6e1524915705b3272bab45c634fb5a37 "operations_research::sat::PresolveContext::IsFullyEncoded" (int ref) const</dt><dd> \anchor _todo002077 (user): If the domain was shrunk, we can have a false positive.
Still it means that the number of values removed is greater than the number
of values not encoded.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a38e2f15d439243fcc447d48fe120624e "operations_research::sat::PresolveContext::NewIntVar" (const Domain &domain)</dt><dd> \anchor _todo002073 (user): We should control more how this is called so we can update
a solution hint accordingly.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a3ee008e9272dbcc3132a667eefc41923 "operations_research::sat::PresolveContext::NotifyThatModelIsUnsat" (absl::string_view message="")</dt><dd> \anchor _todo002074 (user): Report any explanation for the client in a nicer way?
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#a392085a404b28b5e5a405c4e115e5332 "operations_research::sat::PresolveContext::ShiftCostInExactlyOne" (absl::Span< const int > exactly_one, int64_t shift)</dt><dd> \anchor _todo002068 (user): This is a bit hacky, find a nicer way.
<p> \anchor _todo002067 (user): Be more precise with this objective_overflow_detection_ and
always keep it up to date on each offset / coeff change.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#aa087429f5cddf5be6c225890f614b4f1 "operations_research::sat::PresolveContext::StoreAffineRelation" (int ref_x, int ref_y, int64_t coeff, int64_t offset, bool debug_no_recursion=false)</dt><dd> \anchor _todo002061 (user): I am not 100% sure why, but sometimes the representative is
fixed but that is not propagated to ref_x or ref_y and this causes issues.
<p> \anchor _todo002062 (user): we can do better for overflow by not always choosing the
min at zero, do the best things if it becomes needed.
<p> \anchor _todo002063 (user): can we force the rep and remove GetAffineRelation()?
<p> \anchor _todo002064 (user): I am not sure this is needed given the propagation above.
</dd> <dt>
\_setscope operations_research::sat::PresolveContext Member \_internalref classoperations__research_1_1sat_1_1PresolveContext#ab43f7366b32b2ac40cc0f7f668040c49 "operations_research::sat::PresolveContext::UpdateRuleStats" (const std::string &name, int num_times=1)</dt><dd> \anchor _todo002059 rules as this is used to decide if
we loop again.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aa9cd7652ef26e6d69565e1e7e1db3f07 "operations_research::sat::ProbeAndFindEquivalentLiteral" (SatSolver *solver, SatPostsolver *postsolver, DratProofHandler *drat_proof_handler, absl::StrongVector< LiteralIndex, LiteralIndex > *mapping, SolverLogger *logger)</dt><dd> \anchor _todo002271 (user): Fixing a variable might fix more of them by propagation, so
we might not fix everything possible with these loops.
<p> \anchor _todo002270 (user): check compatibility? if x ~ not(x) => unsat.
but probably, the solver would have found this too? not sure...
<p> \anchor _todo002269 (user): Add some constraint so that it does?</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a60a37142e38a0a290d70b030405db801 "operations_research::sat::ProbeAndSimplifyProblem" (SatPostsolver *postsolver, LinearBooleanProblem *problem)</dt><dd> \anchor _todo001038 (user): expose the number of iterations as a parameter.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a98f7eb19b1030f3da667a3914c7ba666 "operations_research::sat::ProbeLiteral" (Literal assumption, SatSolver *solver)</dt><dd> \anchor _todo001954 (user): Still use it if the problem is Boolean only.
</dd> <dt>
\_setscope operations_research::sat::Prober Member \_internalref classoperations__research_1_1sat_1_1Prober#ab1e9d80c7f62d666ad8a3ec5a14f3c13 "operations_research::sat::Prober::ProbeBooleanVariables" (double deterministic_time_limit, absl::Span< const BooleanVariable > bool_vars)</dt><dd> \anchor _todo002090 (user): Instead of an hard deterministic limit, we should probably
use a lower one, but reset it each time we have found something useful.
</dd> <dt>
\_setscope operations_research::sat::Prober Member \_internalref classoperations__research_1_1sat_1_1Prober#a2127d7db0f3c791613c92c8177e02432 "operations_research::sat::Prober::ProbeBooleanVariables" (double deterministic_time_limit)</dt><dd> \anchor _todo002101 (user): Rename to include Integer in the name and distinguish better
from FailedLiteralProbing() below.
<p> \anchor _todo002100 (user): More generally, we might want to register any literal => bound
in the IntegerEncoder. This would allow to remember them and use them in
other part of the solver (cuts, lifting, ...).<p> \anchor _todo002099 (user): This might generate a lot of new direct implications. We might
not want to add them directly to the BinaryImplicationGraph and could
instead use them directly to detect equivalent literal like in
ProbeAndFindEquivalentLiteral(). The situation is not clear.<p> \anchor _todo002098 (user): For now we process the Boolean in their natural order, this is
not the most efficient.</dd> <dt>
\_setscope operations_research::sat::Prober Member \_internalref classoperations__research_1_1sat_1_1Prober#a1323e15e0e075b7a73f7a56e81e42a61 "operations_research::sat::Prober::ProbeDnf" (absl::string_view name, const std::vector< std::vector< Literal > > &dnf)</dt><dd> \anchor _todo002091 (user): Can we use the callback_?
</dd> <dt>
\_setscope operations_research::sat::ProbingOptions Member \_internalref structoperations__research_1_1sat_1_1ProbingOptions#a0ad34d874b506bc2be329d5cc4f8e185 "operations_research::sat::ProbingOptions::deterministic_limit" </dt><dd> \anchor _todo002103 (user): The fix point is not yet reached since we don't currently
simplify non-binary clauses with these equivalence, but we will.
<p> \anchor _todo002102 (user): We can also provide a middle ground and probe all failed
literal but do not extract all binary clauses.</dd> <dt>
\_setscope operations_research::sat::ProbingOptions Member \_internalref structoperations__research_1_1sat_1_1ProbingOptions#af5a82baa2dc19e7fe7e018b63c499042 "operations_research::sat::ProbingOptions::extract_binary_clauses" </dt><dd> \anchor _todo002104 (user): Note that adding binary clause before/during the SAT presolve
is currently not always a good idea. This is because we don't simplify the
other clause as much as we could. Also, there can be up to a quadratic
number of clauses added this way, which might slow down things a lot. But
then because of the deterministic limit, we usually cannot add too much
clauses, even for huge problems, since we will reach the limit before that.
</dd> <dt>
\_setscope operations_research::sat::ProbingOptions Member \_internalref structoperations__research_1_1sat_1_1ProbingOptions#ab4df2ae2f59c5cb13fe680c9580fc64f "operations_research::sat::ProbingOptions::use_queue" </dt><dd> \anchor _todo002105 (user): Decide which one is better, currently the difference seems
small but the queue seems slightly faster.
</dd> <dt>
\_setscope operations_research::sat::ProductDecomposer Member \_internalref classoperations__research_1_1sat_1_1ProductDecomposer#a45c18f04782c89b35181121f284b5ceb "operations_research::sat::ProductDecomposer::TryToLinearize" (const AffineExpression &left, const AffineExpression &right, LinearConstraintBuilder *builder)</dt><dd> \anchor _todo001641 (user): Experiment with x * x where constants = 0, x is
fully encoded, and the domain is small.
</dd> <dt>
\_setscope operations_research::sat::ProductDetector Member \_internalref classoperations__research_1_1sat_1_1ProductDetector#a93e9dea2213cbcd19a3261b4ab6ad7fd "operations_research::sat::ProductDetector::InitializeBooleanRLTCuts" (const absl::flat_hash_map< IntegerVariable, glop::ColIndex > &lp_vars, const absl::StrongVector< IntegerVariable, double > &lp_values)</dt><dd> \anchor _todo001644 (user): limit work if too many ternary.
<p> \anchor _todo001645 (user): Maybe we shouldn't reconstruct this every time, but it is hard
in case of multiple lps to make sure we don't use variables not in the lp
otherwise.
</dd> <dt>
\_setscope operations_research::sat::ProductDetector Member \_internalref classoperations__research_1_1sat_1_1ProductDetector#a3a17220935c42077613be222734fef7a "operations_research::sat::ProductDetector::LinearizeProduct" (IntegerVariable a, IntegerVariable b)</dt><dd> \anchor _todo001654 (user): Implement!
</dd> <dt>
\_setscope operations_research::sat::ProductDetector Member \_internalref classoperations__research_1_1sat_1_1ProductDetector#af7fe2b019ee2556cd2b2813b34877945 "operations_research::sat::ProductDetector::ProcessBinaryClause" (absl::Span< const Literal > binary_clause)</dt><dd> \anchor _todo001642 (user): As product are discovered, we could remove entries from our
hash maps!
</dd> <dt>
\_setscope operations_research::sat::ProductDetector Member \_internalref classoperations__research_1_1sat_1_1ProductDetector#a7473e11336cf79ccf7f4a54a890625fc "operations_research::sat::ProductDetector::ProcessConditionalEquality" (Literal l, IntegerVariable x, IntegerVariable y)</dt><dd> \anchor _todo001653 (user): Generalize to a * X + b = l * (Y + c) since these are also
easy to linearize if we see l * Y.
<p> \anchor _todo001643 (user): Linear scan can be bad if b => X = many other variables.
Hopefully this will not be common.
</dd> <dt>
\_setscope operations_research::sat::ProductDetector Member \_internalref classoperations__research_1_1sat_1_1ProductDetector#a308ee96e864c4e4fac744ac329ecac39 "operations_research::sat::ProductDetector::ProductLowerBound" (IntegerVariable a, IntegerVariable b)</dt><dd> \anchor _todo001655 (user): Implement!
</dd> <dt>
\_setscope operations_research::sat::ProductPropagator Member \_internalref classoperations__research_1_1sat_1_1ProductPropagator#a1a947c821f05a6e347602ffaa4162d1d "operations_research::sat::ProductPropagator::Propagate" () final</dt><dd> \anchor _todo001712 (user): In the reasons, including all 4 bounds is always correct, but
we might be able to relax some of them.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ad8873d5bb4db4affe6faa2da6553882a "operations_research::sat::PropagateAutomaton" (const AutomatonConstraintProto &proto, const PresolveContext &context, std::vector< absl::flat_hash_set< int64_t > > *states, std::vector< absl::flat_hash_set< int64_t > > *labels)</dt><dd> \anchor _todo001106 (user): Note that if we have duplicate variables controlling different
time point, this might not reach the fixed point. Fix? it is not that
important as the expansion take care of this case anyway.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ad1ebf465eb7ccee4f79a5b8cfccfe7d9 "operations_research::sat::PropagateEncodingFromEquivalenceRelations" (const CpModelProto &model_proto, Model *m)</dt><dd> \anchor _todo001180 (user): This is similar to LoadEquivalenceAC() for unreified
constraints, but when the later is called, more encoding might have taken
place.
<p> \anchor _todo001188 (user): In an ideal world, all affine relations like this should be
removed in the presolve.
<p> \anchor _todo001179 (user): This is not supposed to happen, but apparently it did on
once on routing_GCM_0001_sat.fzn. Investigate and fix.
</dd> <dt>
\_setscope operations_research::sat::ProtoTrail Class \_internalref classoperations__research_1_1sat_1_1ProtoTrail "operations_research::sat::ProtoTrail" </dt><dd> \anchor _todo002361 (user): It'd be good to store an earlier level at which
implications may be propagated.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7bb3adbf30215f4aafac3f24caf00f84 "operations_research::sat::PseudoCost" (Model *model)</dt><dd> \anchor _todo001734 (user): This will be overridden by the value decision heuristic in
almost all cases.
</dd> <dt>
\_setscope operations_research::sat::PseudoCosts Member \_internalref classoperations__research_1_1sat_1_1PseudoCosts#a78be0e06d6c1f84281b45b79cb946d92 "operations_research::sat::PseudoCosts::GetBestDecisionVar" ()</dt><dd> \anchor _todo002107 (user): Avoid the O(num_relevant_variable) loop.
In practice since a variable only become relevant after 100 records, this
list might be small compared to the number of variable though.
<p> \anchor _todo002106 (user): Supports search randomization tolerance.
<p> <p>(user): Implement generic class to choose the randomized
solution, and supports sub-linear variable selection.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ac2b9ed2c9fd55af7cfd4effe1ad5a5d6 "operations_research::sat::RandomizeOnRestartHeuristic" (bool lns_mode, Model *model)</dt><dd> \anchor _todo001747 (user): Add other policies and perform more experiments.
<p> \anchor _todo001749 (user): These distribution values are just guessed values. They
need to be tuned.
<p> \anchor _todo001750 (user): Also use LP value as assignment like in Bop.
<p> \anchor _todo001748 (user): Do more experiments to find better distribution.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a774bb7b95d0309e6e4448b044b88c456 "operations_research::sat::RecordLPRelaxationValues" (Model *model)</dt><dd> \anchor _todo002109 (user): The default of ::infinity() for variable for which we do not
have any LP solution is weird and inconsistent with ModelLpValues default
which is zero. Fix. Note that in practice, at linearization level 2, all
variable will eventually have an lp relaxation value, so it shoulnd't
matter much to just use zero in RINS/RENS.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4c7c0126948e1cf811fc9fe8519915e5 "operations_research::sat::ReduceNodes" (Coefficient upper_bound, Coefficient *lower_bound, std::vector< EncodingNode * > *nodes, SatSolver *solver)</dt><dd> \anchor _todo001614 (user): with DEFAULT_ASSUMPTION_ORDER, this will lead to a somewhat
weird behavior, since we will reverse the nodes at each iteration...
</dd> <dt>
\_setscope operations_research::sat::RelaxationInducedNeighborhoodGenerator Member \_internalref classoperations__research_1_1sat_1_1RelaxationInducedNeighborhoodGenerator#aa4724e62d610d139a8ae7197f1004823 "operations_research::sat::RelaxationInducedNeighborhoodGenerator::Generate" (const CpSolverResponse &initial_solution, double difficulty, absl::BitGenRef random) final</dt><dd> \anchor _todo001153 (user): Instead of aborting, pick the closest point in the domain?
</dd> <dt>
\_setscope operations_research::sat::RelaxRandomConstraintsGenerator Class \_internalref classoperations__research_1_1sat_1_1RelaxRandomConstraintsGenerator "operations_research::sat::RelaxRandomConstraintsGenerator" </dt><dd> \anchor _todo001160 (user): In the presence of connected components, this should just work
on one of them.
</dd> <dt>
\_setscope operations_research::sat::RelaxRandomConstraintsGenerator Member \_internalref classoperations__research_1_1sat_1_1RelaxRandomConstraintsGenerator#a3e22fc48cf6041968e6f6119e642cf64 "operations_research::sat::RelaxRandomConstraintsGenerator::Generate" (const CpSolverResponse &initial_solution, double difficulty, absl::BitGenRef random) final</dt><dd> \anchor _todo001148 (user): Clean-up when target_size == 0.
<p> \anchor _todo001149 (user): randomize order of variable addition when close to the
limit.
</dd> <dt>
\_setscope operations_research::sat::RelaxRandomVariablesGenerator Class \_internalref classoperations__research_1_1sat_1_1RelaxRandomVariablesGenerator "operations_research::sat::RelaxRandomVariablesGenerator" </dt><dd> \anchor _todo001159 (user): In the presence of connected components, this should just work
on one of them.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a89dc2fa5d4896cd17270cf7d40099e08 "operations_research::sat::ReportEnergyConflict" (Rectangle bounding_box, absl::Span< const int > boxes, SchedulingConstraintHelper *x, SchedulingConstraintHelper *y)</dt><dd> \anchor _todo001585 (user): relax the bounding box dimension to have a relaxed explanation.
We can also minimize the number of required intervals.
<p> \anchor _todo001583 (user): Also relax the box if possible.
</dd> <dt>
\_setscope operations_research::sat::RestartPolicy Member \_internalref classoperations__research_1_1sat_1_1RestartPolicy#a52594750ea119a9ac928e3f09b77f140 "operations_research::sat::RestartPolicy::Reset" ()</dt><dd> \anchor _todo002108 (user): for some reason, strategies_.assign() does not work as the
returned type of the proto enum iterator is int ?!
</dd> <dt>
\_setscope operations_research::sat::RoundingOptions Struct \_internalref structoperations__research_1_1sat_1_1RoundingOptions "operations_research::sat::RoundingOptions" </dt><dd> \anchor _todo001567 (user): There is a bunch of heuristic involved here, and we could spend
more effort tuning them. In particular, one can try many heuristics and keep
the best looking cut (or more than one). This is not on the critical code
path, so we can spend more effort in finding good cuts.
</dd> <dt>
\_setscope operations_research::sat::SatDecisionPolicy Member \_internalref classoperations__research_1_1sat_1_1SatDecisionPolicy#a118a1b216d1e79a4b9c250f3030adda7 "operations_research::sat::SatDecisionPolicy::AllPreferences" () const</dt><dd> \anchor _todo002131 (user): we currently assume that if the tie_breaker is zero then
no preference was set (which is not 100% correct). Fix that.
</dd> <dt>
\_setscope operations_research::sat::SatDecisionPolicy Member \_internalref classoperations__research_1_1sat_1_1SatDecisionPolicy#ad02a374fc46af7a8ed8112257438dbc1 "operations_research::sat::SatDecisionPolicy::NextBranch" ()</dt><dd> \anchor _todo002132 (user): This may not be super efficient if almost all the
variables are assigned.
</dd> <dt>
\_setscope operations_research::sat::SatDecisionPolicy Member \_internalref classoperations__research_1_1sat_1_1SatDecisionPolicy#a9f05bb03afa86725c194d50e613f2593 "operations_research::sat::SatDecisionPolicy::Untrail" (int target_trail_index)</dt><dd> \anchor _todo002133 (user): avoid looping twice over the trail?
<p> \anchor _todo002135 (user): This heuristic can make this code quite slow because
all the untrailed variable will cause a priority queue update.
<p> \anchor _todo002134 (user): Expose parameters for these values.
</dd> <dt>
\_setscope operations_research::sat::SatPostsolver Member \_internalref classoperations__research_1_1sat_1_1SatPostsolver#a3336b2762049c2d81e2bd255e9c9ecc8 "operations_research::sat::SatPostsolver::Clause" (int i) const</dt><dd> \anchor _todo002276 (user): we could avoid the copy here, but because clauses_literals_
is a deque, we do need a special return class and cannot juste use
absl::Span<Literal> for instance.
</dd> <dt>
\_setscope operations_research::sat::SatPostsolver Member \_internalref classoperations__research_1_1sat_1_1SatPostsolver#ad351af493e5b70fc12534bc0806cc444 "operations_research::sat::SatPostsolver::FixVariable" (Literal x)</dt><dd> \anchor _todo002275 (user): this as almost the same effect as adding an unit clause, and we
should probably remove this to simplify the code.
</dd> <dt>
\_setscope operations_research::sat::SatPresolveOptions Member \_internalref structoperations__research_1_1sat_1_1SatPresolveOptions#a99051170412df0832ce84112ddd314c0 "operations_research::sat::SatPresolveOptions::use_transitive_reduction" </dt><dd> \anchor _todo002196 (user): Doing that before the current SAT presolve also change the
possible reduction. This shouldn't matter if we use the binary implication
graph and its reachability instead of just binary clause though.
</dd> <dt>
\_setscope operations_research::sat::SatPresolver Class \_internalref classoperations__research_1_1sat_1_1SatPresolver "operations_research::sat::SatPresolver" </dt><dd> \anchor _todo002273 (user): Forbid the removal of some variables. This way we can presolve
only the clause part of a general Boolean problem by not removing variables
appearing in pseudo-Boolean constraints.
<p> \anchor _todo002272 (user): Interact more with a SAT solver to reuse its propagation logic.</dd> <dt>
\_setscope operations_research::sat::SatPresolver Member \_internalref classoperations__research_1_1sat_1_1SatPresolver#a48d43c858e789a63bf76da7414b55a5f "operations_research::sat::SatPresolver::ClauseIndex" </dt><dd> \anchor _todo002277 (user): use IntType!
</dd> <dt>
\_setscope operations_research::sat::SatPresolver Member \_internalref classoperations__research_1_1sat_1_1SatPresolver#a4b58b71a43c02cbec8fefb126f0a61cb "operations_research::sat::SatPresolver::CrossProduct" (Literal x)</dt><dd> \anchor _todo002266 (user): Choose if we use x or x.Negated() depending on the list
sizes? The function achieve the same if x = x.Negated(), however the
loops are not done in the same order which may change this incomplete
"blocked" clause detection.
<p> \anchor _todo002268 (user): At this point x.Variable() is added back to the priority queue.
Avoid doing that.
<p> \anchor _todo002267 (user): We could only update the priority queue once for each variable
instead of doing it many times.
</dd> <dt>
\_setscope operations_research::sat::SatPresolver Member \_internalref classoperations__research_1_1sat_1_1SatPresolver#adb7846ae7bbe4ca2e07a1dba94fe686e "operations_research::sat::SatPresolver::Presolve" (const std::vector< bool > &var_that_can_be_removed)</dt><dd> \anchor _todo002255 (user): When a clause is strengthened, add it to a queue so it can
be processed again?
</dd> <dt>
\_setscope operations_research::sat::SatPresolver Member \_internalref classoperations__research_1_1sat_1_1SatPresolver#a32df98e6426d1e7a18247a18207717f1 "operations_research::sat::SatPresolver::Presolve" ()</dt><dd> \anchor _todo002278 (user): Add support for a time limit and some kind of iterations limit
so that this can never take too much time.
</dd> <dt>
\_setscope operations_research::sat::SatPresolver Member \_internalref classoperations__research_1_1sat_1_1SatPresolver#af7e0881274e8e8cec31c85429900b42a "operations_research::sat::SatPresolver::PresolveWithBva" ()</dt><dd> \anchor _todo002256 (user): Put work limit in place !
</dd> <dt>
\_setscope operations_research::sat::SatPresolver Member \_internalref classoperations__research_1_1sat_1_1SatPresolver#a8d8418b2601e61829de5e7b3f4df122b "operations_research::sat::SatPresolver::ProcessClauseToSimplifyOthers" (ClauseIndex clause_index)</dt><dd> \anchor _todo002263 (user): Binary clauses are really common, and we can probably do this
more efficiently for them. For instance, we could just take the intersection
of two sorted lists to get the simplified clauses.
<p> \anchor _todo002265 (user): remove the old clauses_[ci] afterwards.
<p> \anchor _todo002264 (user): not super optimal since we could abort earlier if
opposite_literal is not the negation of shortest_list. Note that this
applies to the second call to
ProcessClauseToSimplifyOthersUsingLiteral() above too.
</dd> <dt>
\_setscope operations_research::sat::SatPropagator Member \_internalref classoperations__research_1_1sat_1_1SatPropagator#a2bde4f8c3d7c6326050ac164391bf2a7 "operations_research::sat::SatPropagator::PropagatePreconditionsAreSatisfied" (const Trail &trail) const</dt><dd> \anchor _todo002122 (user): A few of these method should be moved in a .cc
</dd> <dt>
\_setscope operations_research::sat::SatPropagator Member \_internalref classoperations__research_1_1sat_1_1SatPropagator#a68acada7af835c9c6870ceb876dc2d9c "operations_research::sat::SatPropagator::Untrail" (const Trail &trail, int trail_index)</dt><dd> \anchor _todo002129 (user): It is not yet 100% the case, but this can be guaranteed to be
called with a trail index that will always be the start of a new decision
level.
<p> \anchor _todo002128 (user): Currently this is called at each Backtrack(), but we could
bundle the calls in case multiple conflict one after the other are detected
even before the Propagate() call of a SatPropagator is called.</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a8b9ba983bd9f911d0605f7615ebf3725 "operations_research::sat::SatSolver::AddClauseDuringSearch" (absl::Span< const Literal > literals)</dt><dd> \anchor _todo002201 (user): We generate in some corner cases clauses with
literals[0].Variable() == literals[1].Variable(). Avoid doing that and
adding such binary clauses to the graph?
<p> \anchor _todo002244 (user): Backjump and propagate on a falsified clause? this is currently
not needed.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a098038f8e0409a8243ff3f7eafb517f8 "operations_research::sat::SatSolver::AddLinearConstraint" (bool use_lower_bound, Coefficient lower_bound, bool use_upper_bound, Coefficient upper_bound, std::vector< LiteralWithCoeff > *cst)</dt><dd> \anchor _todo002240 (user): Instead of failing, implement an error handling code.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a2613df5393b4e2285789856150543b70 "operations_research::sat::SatSolver::AddProblemClause" (absl::Span< const Literal > literals, bool is_safe=true)</dt><dd> \anchor _todo002239 (user): Rename this to AddClause(), also get rid of the specialized
AddUnitClause(), AddBinaryClause() and AddTernaryClause() since they
just end up calling this?
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a7c0c2912da716e49c8b5d84108e463d7 "operations_research::sat::SatSolver::Backtrack" (int target_level)</dt><dd> \anchor _todo002211 (user): The backtrack method should not be called when the model is
unsat. Add a DCHECK to prevent that, but before fix the
bop::BopOptimizerBase architecture.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a1ac88207c0228d80d19751186955240f "operations_research::sat::SatSolver::deterministic_time" () const</dt><dd> \anchor _todo002200 (user): Find a better procedure to fix the weight than just educated
guess.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a0174fd7221118d81a925d32aaed1cc79 "operations_research::sat::SatSolver::ExtractClauses" (Output *out)</dt><dd> \anchor _todo002243 (user): also copy the removable clauses?
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#ad4458486171153c1793c28e2091140d9 "operations_research::sat::SatSolver::FinishPropagation" ()</dt><dd> \anchor _todo002205 (user): Exiting like this might cause issue since the propagation
is not "finished" but some code might assume it is. However since we
already might repropagate in the LP constraint, most of the code
should support "not finished propagation".
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a84e27e6cb848b3176ab5680292d116a8 "operations_research::sat::SatSolver::IsModelUnsat" () const</dt><dd> \anchor _todo002241 (user): remove this function.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a5420a6d871314779beeac0c074241c1a "operations_research::sat::SatSolver::model" ()</dt><dd> \anchor _todo002237 (user): Remove. This is temporary for accessing the model deep within
some old code that didn't use the Model object.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a3afed23ec8289b170f0a25ec4b10dd84 "operations_research::sat::SatSolver::ProcessCurrentConflict" ()</dt><dd> \anchor _todo002206 (user): We might still want to "learn" the clause, especially if
it reduces to only one literal in which case we can just fix it.
<p> \anchor _todo002207 (user): Note that we use the clause above to update the variable
activities and not the pb conflict. Experiment.
<p> \anchor _todo002208 (user): This is error prone, find a better way?
<p> \anchor _todo002209 (user): It is unclear what the best heuristic is here. Both the current
trail index or the trail before the current decision perform well, but
using the full trail seems slightly better even though it will contain the
current conflicting literal.
<p> \anchor _todo002210 (user): Either remove that algorithm or support subsumption by just
checking if it is okay to do so, or doing it on the fly while computing the
first UIP.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a9188c70cc1096900a623a26319a1d4b8 "operations_research::sat::SatSolver::Propagate" ()</dt><dd> \anchor _todo002221 (user): Support propagating only the "first" propagators. That can
be useful for probing/in-processing, so we can control if we do only the SAT
part or the full integer part...
<p> \anchor _todo002222 (user): This might not really be needed.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#a50484f243bcc0ec12ed3919d84dc38ad "operations_research::sat::SatSolver::SetAssignmentPreference" (Literal literal, float weight)</dt><dd> \anchor _todo002242 (user): Clean this up by making clients directly talk to
SatDecisionPolicy.
</dd> <dt>
\_setscope operations_research::sat::SatSolver Member \_internalref classoperations__research_1_1sat_1_1SatSolver#ae8f40548efeb9f6bde6ff1cd872acc38 "operations_research::sat::SatSolver::SetNumVariables" (int num_variables)</dt><dd> \anchor _todo002238 (user): Rename to IncreaseNumVariablesTo() until we support removing
variables...
</dd> <dt>
\_setscope operations_research::sat::SavedVariable Class \_internalref classoperations__research_1_1sat_1_1SavedVariable "operations_research::sat::SavedVariable" </dt><dd> \anchor _todo002072 (user): get rid of this, we don't have the notion of equivalent variable
anymore, but the more general affine relation one. We just need to support
general affine for the linear1 involving an absolute value.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ad6d384c7c56f3027894875278e4b9526 "operations_research::sat::ScaleContinuousVariables" (double scaling, double max_bound, MPModelProto *mp_model)</dt><dd> \anchor _todo001934 (user): Also scale the solution hint if any.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ab5275984bb2d64275b69e881316b7f34 "operations_research::sat::ScanModelForDominanceDetection" (PresolveContext &context, VarDomination *var_domination)</dt><dd> \anchor _todo002347 (user): Maybe we should avoid recomputing that here.
<p> \anchor _todo002348 (user): Handle enforcement better here.
<p> \anchor _todo002349 (user): the way we process that is a bit restrictive. By
working on the implication graph we could detect more dominance
relations. Since if a => b we say that a++ can only be paired with
b–, but it could actually be paired with any variables that when
dereased implies b = 0. This is a bit mitigated by the fact that
we regroup when we can such implications into big at most ones.
<p> \anchor _todo002350 (user): We might be able to detect that nothing can be done earlier
during the constraint scanning.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7b440ecab00a601d5643f21df87c7cc6 "operations_research::sat::ScanModelForDualBoundStrengthening" (const PresolveContext &context, DualBoundStrengthening *dual_bound_strengthening)</dt><dd> \anchor _todo002351 (user): Maybe we should avoid recomputing that here.
<p> \anchor _todo002352 (user): Handle enforcement better here.
</dd> <dt>
\_setscope operations_research::sat::ScatteredIntegerVector Member \_internalref classoperations__research_1_1sat_1_1ScatteredIntegerVector#a5d028844e2ffb568bbc68185f7cb6260 "operations_research::sat::ScatteredIntegerVector::ConvertToLinearConstraint" (absl::Span< const IntegerVariable > integer_variables, IntegerValue upper_bound, std::optional< std::pair< IntegerVariable, IntegerValue > > extra_term=std::nullopt)</dt><dd> \anchor _todo001873 (user): Ideally we should convert to IntegerVariable as late as
possible. Prefer to use GetTerms().
</dd> <dt>
\_setscope operations_research::sat::SccGraph Member \_internalref classoperations__research_1_1sat_1_1SccGraph#aee95126bcb16bb7a70ab00218a15fd7f "operations_research::sat::SccGraph::operator[]" (int32_t node) const</dt><dd> \anchor _todo001076 (user): avoid looping more than twice on the same at most one
constraints? Note that the second time we loop we have x => y =>
not(x), so we can already detect that x must be false which we
detect below.
</dd> <dt>
\_setscope operations_research::sat::SchedulingConstraintHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingConstraintHelper#acbf45814a5a4f7554173a02e61970fa8 "operations_research::sat::SchedulingConstraintHelper::GetCurrentMinDistanceBetweenTasks" (int a, int b, bool add_reason_if_after=false)</dt><dd> \anchor _todo001771 (user): be more precise when we know a and b are in disjunction.
we really just need start_b > start_a, or even >= if duration is non-zero.
</dd> <dt>
\_setscope operations_research::sat::SchedulingConstraintHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingConstraintHelper#a648ff007cfc81bd0a4369701a7048a27 "operations_research::sat::SchedulingConstraintHelper::GetEnergyProfile" ()</dt><dd> \anchor _todo001772 (user): Avoid recomputing it if nothing changed.
</dd> <dt>
\_setscope operations_research::sat::SchedulingConstraintHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingConstraintHelper#a98e816cae622855fe8eae0766b4e0aaf "operations_research::sat::SchedulingConstraintHelper::InPropagationLoop" () const</dt><dd> \anchor _todo001778 (user): Change the propagation loop code so that we don't stop
pushing in the middle of the propagation as more advanced propagator do
not handle this correctly.
</dd> <dt>
\_setscope operations_research::sat::SchedulingConstraintHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingConstraintHelper#a230beffeb33f166d27bc233bed77237a "operations_research::sat::SchedulingConstraintHelper::SchedulingConstraintHelper" (int num_tasks, Model *model)</dt><dd> \anchor _todo001776 (user): Remove this. It is a hack because the disjunctive class needs
to fetch the maximum possible number of task at construction.
</dd> <dt>
\_setscope operations_research::sat::SchedulingConstraintHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingConstraintHelper#aac6715a4e5f01196e19399a749218d13 "operations_research::sat::SchedulingConstraintHelper::SetLevel" (int level) final</dt><dd> \anchor _todo001769 (user): We could be smarter here, but then this is not visible in our
cpu_profile since we call many times IncrementalPropagate() for each new
decision, but just call Propagate() once after each Untrail().
</dd> <dt>
\_setscope operations_research::sat::SchedulingConstraintHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingConstraintHelper#a0829ed1b078db163e11c4114f71758c3 "operations_research::sat::SchedulingConstraintHelper::TaskByIncreasingStartMin" ()</dt><dd> \anchor _todo001777 (user): we could merge the first loop of IncrementalSort() with the
loop that fill TaskTime.time at each call.
</dd> <dt>
\_setscope operations_research::sat::SchedulingDemandHelper Class \_internalref classoperations__research_1_1sat_1_1SchedulingDemandHelper "operations_research::sat::SchedulingDemandHelper" </dt><dd> \anchor _todo001775 (user): Cache energy min and reason for the non O(1) cases.
</dd> <dt>
\_setscope operations_research::sat::SchedulingDemandHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingDemandHelper#a8b7226d12b17723e0174250fd2024f46 "operations_research::sat::SchedulingDemandHelper::AddEnergyMinInWindowReason" (int t, IntegerValue window_start, IntegerValue window_end)</dt><dd> \anchor _todo001774 (user): only include the one we need?
</dd> <dt>
\_setscope operations_research::sat::SchedulingDemandHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingDemandHelper#a9019a263126e78ddf332f696649fda87 "operations_research::sat::SchedulingDemandHelper::CacheAllEnergyValues" ()</dt><dd> \anchor _todo001780 (user): this is error prone, maybe we should revisit. But if
there is many alternatives, we don't want to rescan the list more than a
linear number of time per propagation.<p> \anchor _todo001781 (user): Add more complex EnergyMinBefore(time) once we also support
expressing the interval as a set of alternatives.</dd> <dt>
\_setscope operations_research::sat::SchedulingDemandHelper Member \_internalref classoperations__research_1_1sat_1_1SchedulingDemandHelper#ad690f09e6894f8f9e9b01642fa1fc822 "operations_research::sat::SchedulingDemandHelper::DecreaseEnergyMax" (int t, IntegerValue value)</dt><dd> \anchor _todo001773 (user): Propagate if possible.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a85b41013bb2f7709a99765d5c491f381 "operations_research::sat::SchedulingSearchHeuristic" (Model *model)</dt><dd> \anchor _todo001735 (user): we should also precompute fixed precedences and only fix
interval that have all their predecessors fixed.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a8a9624d210768499700918aa0c4eecf2 "operations_research::sat::SeparateFlowInequalities" (int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< AffineExpression > &arc_capacities, std::function< void(const std::vector< bool > &in_subset, IntegerValue *min_incoming_flow, IntegerValue *min_outgoing_flow)> get_flows, const absl::StrongVector< IntegerVariable, double > &lp_values, LinearConstraintManager *manager, Model *model)</dt><dd> \anchor _todo002113 (user): Alternatively, try MIR heuristics if the coefficients in
the capacities are not all the same.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2b655336dd6b108cddff7ff5e87360d3 "operations_research::sat::SeparateSubtourInequalities" (int num_nodes, const std::vector< int > &tails, const std::vector< int > &heads, const std::vector< Literal > &literals, absl::Span< const int64_t > demands, int64_t capacity, LinearConstraintManager *manager, Model *model)</dt><dd> \anchor _todo002111 (user): Currently if we add too many not so relevant cuts, our generic
MIP cut heuritic are way too slow on TSP/VRP problems.
<p> \anchor _todo002112 (user): I had an older version that tried the n-cuts generated during
the course of the algorithm. This could also be interesting. But it is
hard to tell with our current benchmark setup.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4accab74442b986ddcc870636b232756 "operations_research::sat::SequentialValueSelection" (std::vector< std::function< IntegerLiteral(IntegerVariable)> > value_selection_heuristics, std::function< BooleanOrIntegerLiteral()> var_selection_heuristic, Model *model)</dt><dd> \anchor _todo001731 (user): we will likely stop at the first non-fixed variable.
</dd> <dt>
\_setscope operations_research::sat::SharedBoundsManager Member \_internalref classoperations__research_1_1sat_1_1SharedBoundsManager#aa52efbe166740ce4b1f22c820a64ffc6 "operations_research::sat::SharedBoundsManager::FixVariablesFromPartialSolution" (const std::vector< int64_t > &solution, const std::vector< int > &variables_to_fix)</dt><dd> \anchor _todo002295 (user): Because we look at the non-synchronized and up to date bounds,
this break determinism if two solution for the same subpart comes at the same
time.
</dd> <dt>
\_setscope operations_research::sat::SharedClausesManager Member \_internalref classoperations__research_1_1sat_1_1SharedClausesManager#a3ebbcf2be803ef7f2cbad87a044dc4ec "operations_research::sat::SharedClausesManager::Synchronize" ()</dt><dd> \anchor _todo002296 (user): We could cleanup added_binary_clauses_ periodically.
</dd> <dt>
\_setscope operations_research::sat::SharedResponseManager Member \_internalref classoperations__research_1_1sat_1_1SharedResponseManager#adbf9c545bd1e91d71d36638ca7c1acfd "operations_research::sat::SharedResponseManager::NewSolution" (absl::Span< const int64_t > solution_values, const std::string &solution_info, Model *model=nullptr)</dt><dd> \anchor _todo002294 (user): Remove this code and the need for model in this function.
Use search log callbacks instead.
</dd> <dt>
\_setscope operations_research::sat::SharedResponseManager Member \_internalref classoperations__research_1_1sat_1_1SharedResponseManager#af4876e4857461716fabf61e3df652bd6 "operations_research::sat::SharedResponseManager::UpdateInnerObjectiveBounds" (const std::string &update_info, IntegerValue lb, IntegerValue ub)</dt><dd> \anchor _todo002292 (user): A thread might not be notified right away that the new bounds
that it is pushing make the problem infeasible. Fix that. For now we just
abort early here to avoid logging the "#Done" message multiple times.
</dd> <dt>
\_setscope operations_research::sat::SharedSolutionRepository Class \_internalref classoperations__research_1_1sat_1_1SharedSolutionRepository "operations_research::sat::SharedSolutionRepository< ValueType >" </dt><dd> \anchor _todo002297 (user): Maybe add some criteria to only keep solution with an objective
really close to the best solution.
</dd> <dt>
\_setscope operations_research::sat::SharedSolutionRepository Member \_internalref classoperations__research_1_1sat_1_1SharedSolutionRepository#a5c764f4976d30e6f103b76a929402c87 "operations_research::sat::SharedSolutionRepository< ValueType >::GetRandomBiasedSolution" (absl::BitGenRef random) const</dt><dd> \anchor _todo002298 (user): Experiments on the best distribution.
</dd> <dt>
\_setscope operations_research::sat::SharedSolutionRepository::Solution Member \_internalref structoperations__research_1_1sat_1_1SharedSolutionRepository_1_1Solution#a1e89b8e75d0f5d4196f9cc06abbfa689 "operations_research::sat::SharedSolutionRepository< ValueType >::Solution::rank" </dt><dd> \anchor _todo002300 (user): Some LNS code assume that for the SharedSolutionRepository
this rank is actually the unscaled internal minimization objective.
Remove this assumptions by simply recomputing this value since it is not
too costly to do so.
</dd> <dt>
\_setscope operations_research::sat::SharedSolutionRepository Member \_internalref classoperations__research_1_1sat_1_1SharedSolutionRepository#a902c7f2bb1e91b85d85bad84726bf89b "operations_research::sat::SharedSolutionRepository< ValueType >::Synchronize" ()</dt><dd> \anchor _todo002299 (user): Introduce a notion of orthogonality to diversify the pool?
</dd> <dt>
\_setscope operations_research::sat::SharedTreeManager Member \_internalref classoperations__research_1_1sat_1_1SharedTreeManager#a98c561c89b5bc43b4aa0debbcef4200e "operations_research::sat::SharedTreeManager::ProposeSplit" (ProtoTrail &path, ProtoLiteral decision)</dt><dd> \anchor _todo002358 (user): Need to write up the shape this creates.
This rule will allow twice as many leaves in the preferred subtree.
</dd> <dt>
\_setscope operations_research::sat::SharedTreeManager Member \_internalref classoperations__research_1_1sat_1_1SharedTreeManager#aa6d71bb864a47eaeb3edb91b97819686 "operations_research::sat::SharedTreeManager::ReplaceTree" (ProtoTrail &path)</dt><dd> \anchor _todo002359 (user): Investigate assigning a random leaf so workers can still
improve shared tree bounds.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a4bfc95b7fb811709c6763963bee970a4 "operations_research::sat::ShaveObjectiveLb" (Model *model)</dt><dd> \anchor _todo001733 (user): Do we need a mechanism to reduce the range of possible gaps
when nothing gets proven? This could be a parameter or some adaptative code.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a0479a7ca6dd22cbabccdf623aea07315 "operations_research::sat::SimplifyCanonicalBooleanLinearConstraint" (std::vector< LiteralWithCoeff > *cst, Coefficient *rhs)</dt><dd> \anchor _todo001985 (user): Use more complex simplification like dividing by the gcd of
everyone and using less different coefficients if possible.
<p> \anchor _todo001986 (user): It is probably better to remove these literals and have other
constraint setting them to false from the symmetry finder perspective.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ab649ca11fd81e049dc7a8c0dd1104b5b "operations_research::sat::SimplifyClause" (const std::vector< Literal > &a, std::vector< Literal > *b, LiteralIndex *opposite_literal, int64_t *num_inspected_literals)</dt><dd> \anchor _todo002274 (user): when a.size() << b.size(), we should use binary search instead
of scanning b linearly.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a336d2faa10d80d646232f5e6d91891d4 "operations_research::sat::SolutionIsFeasible" (const CpModelProto &model, absl::Span< const int64_t > variable_values, const CpModelProto *mapping_proto, const std::vector< int > *postsolve_mapping)</dt><dd> \anchor _todo001103 (user): This is not really a "feasibility" question, but we should
probably check that the response objective matches with the one we can
compute here. This might better be done in another function though.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a9d67b9c66f1cb9c1dcc3415cd5af11bf "operations_research::sat::SolveCpModel" (const CpModelProto &model_proto, Model *model)</dt><dd> \anchor _todo001406 (user): We currently reuse the MODEL_INVALID status even though it
is not the best name for this. Maybe we can add a PARAMETERS_INVALID
when it become needed. Or rename to INVALID_INPUT ?
<p> \anchor _todo001409 (user): Change status to IMPRECISE?
<p> \anchor _todo001408 (user): At this point, the model is trivial, but we could exit
early.
<p> \anchor _todo001407 (user): provide an option to skip this step for speed?
<p> \anchor _todo001410 (user): for now, we just use the domain inferred during
presolve.
<p> \anchor _todo001411 (user): We could try to dump our linear relaxation too.
<p> \anchor _todo001412 (user): Even for an optimization, if we load the solution right away,
we might not have the same behavior as the initial search that follow the
hint will be infeasible, so the activities of the variables will be
different.
<p> \anchor _todo001413 (user): Reuse a Subsolver to get the same display as for the
parallel case. Right now we don't have as much stats for single thread!
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a43a3828d1897a92ece5fd4f6018fe3da "operations_research::sat::SolveDiophantine" (absl::Span< const int64_t > coeffs, int64_t rhs, absl::Span< const int64_t > var_lbs, absl::Span< const int64_t > var_ubs)</dt><dd> \anchor _todo001587 (user): look if there is a natural improvement.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aa4dae45317363a09e5f5f5ac22394f74 "operations_research::sat::SolveFzWithCpModelProto" (const fz::Model &fz_model, const fz::FlatzincSatParameters &p, const std::string &sat_params, SolverLogger *logger, SolverLogger *solution_logger)</dt><dd> \anchor _todo000402 (user): Supports setting the number of workers to 0, which will
then query the number of cores available. This is complex now as we
need to still support the expected behabior (no flags -> 1 thread
fixed search, -f -> 1 thread free search).
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2af162f5376a8d8234b9287b5c8163c1 "operations_research::sat::SplitAndLoadIntermediateConstraints" (bool lb_required, bool ub_required, std::vector< IntegerVariable > *vars, std::vector< int64_t > *coeffs, Model *m)</dt><dd> \anchor _todo001189 (user): Alternatively, we could use a O(num_changes) propagation (a
bit tricky to implement), or a decomposition into a tree with more than
one level. Both requires experimentations.
<p> \anchor _todo001182 (user): We could use a smarter way to determine buckets, like putting
everyone with the same coeff together if possible and the split is ok.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a5154a61154ff9b3522e0c0eba7ed0319 "operations_research::sat::SplitAroundLpValue" (IntegerVariable var, Model *model)</dt><dd> \anchor _todo001729 (user): Why is the reduced cost doing things differently?
<p> \anchor _todo001728 (user): Depending if we branch up or down, this might not exclude the
LP value, which is potentially a bad thing.</dd> <dt>
\_setscope operations_research::sat::SquarePropagator Class \_internalref classoperations__research_1_1sat_1_1SquarePropagator "operations_research::sat::SquarePropagator" </dt><dd> \anchor _todo001720 (user): Only works for x nonnegative.
</dd> <dt>
\_setscope operations_research::sat::StampingSimplifier Member \_internalref classoperations__research_1_1sat_1_1StampingSimplifier#a2e92cf06868589083c5369b049fc5a26 "operations_research::sat::StampingSimplifier::ComputeStampsForNextRound" (bool log_info)</dt><dd> \anchor _todo002163 (user): compute some dtime, it is always zero currently.
</dd> <dt>
\_setscope operations_research::sat::StampingSimplifier Member \_internalref classoperations__research_1_1sat_1_1StampingSimplifier#abf4ca83561578670ef702769097d29fd "operations_research::sat::StampingSimplifier::DoOneRound" (bool log_info)</dt><dd> \anchor _todo002162 (user): We could probably deal with it if needed so that we don't
need to do equivalence detection each time we want to run this.
<p> \anchor _todo002198 (user): To save one scan over all the clauses, we could do the fixed
and equivalence variable cleaning here too.
</dd> <dt>
\_setscope operations_research::sat::StampingSimplifier Member \_internalref classoperations__research_1_1sat_1_1StampingSimplifier#adeaa7bc64c667a667195ba5f6161f8c1 "operations_research::sat::StampingSimplifier::ProcessClauses" ()</dt><dd> \anchor _todo002168 (user): Note that it is okay to still use top_entry, but we
might miss the removal of b if b => c. Also the paper do things
differently. Make sure we don't miss any simplification
opportunites by not changing top_entry. Same in the other
branches.
<p> \anchor _todo002167 below.
</dd> <dt>
\_setscope operations_research::sat::StampingSimplifier Member \_internalref classoperations__research_1_1sat_1_1StampingSimplifier#ab4ed798d7a5c1b5957e4f9605963174e "operations_research::sat::StampingSimplifier::SampleTreeAndFillParent" ()</dt><dd> \anchor _todo002166 (user): More generally, we could sample a parent while probing so
that we consider all hyper binary implications (in the case we don't add
them to the implication graph already).
<p> \anchor _todo002165 (user): if parents_[x] = y, try not to have parents_[not(y)] = not(x)
because this is not as useful for the simplification power.<p> \anchor _todo002164 (user): Better algo to not select redundant parent.</dd> <dt>
\_setscope operations_research::sat::SubSolver Member \_internalref classoperations__research_1_1sat_1_1SubSolver#a4edf090e6f497b612dab8bfc4b53cd4c "operations_research::sat::SubSolver::DeterministicTimingInfo" () const</dt><dd> \anchor _todo002282 (user): remove trailing "
" from ValueAsString().
</dd> <dt>
\_setscope operations_research::sat::SubSolver Member \_internalref classoperations__research_1_1sat_1_1SubSolver#a68765bc7ed07ce93ffeddbe61ad40d65 "operations_research::sat::SubSolver::GenerateTask" (int64_t task_id)=0</dt><dd> \anchor _todo002280 (user): We could use a more complex selection logic and pass in the
deterministic time limit this subtask should run for. Unclear at this
stage.</dd> <dt>
\_setscope operations_research::sat::SubSolver Member \_internalref classoperations__research_1_1sat_1_1SubSolver#a03147f5723fa17d3ce80ace93578af57 "operations_research::sat::SubSolver::TimingInfo" () const</dt><dd> \anchor _todo002281 (user): remove trailing "
" from ValueAsString() or just build the
table line directly.
</dd> <dt>
\_setscope operations_research::sat::SymmetryPropagator Class \_internalref classoperations__research_1_1sat_1_1SymmetryPropagator "operations_research::sat::SymmetryPropagator" </dt><dd> \anchor _todo002284 (user): Implement the optimizations mentioned in the paper?
<p> <p>(user): Instrument and see if the code can be optimized.
</dd> <dt>
\_setscope operations_research::sat::SymmetryPropagator Member \_internalref classoperations__research_1_1sat_1_1SymmetryPropagator#a020a35d3244af33a45a416f037529459 "operations_research::sat::SymmetryPropagator::AddSymmetry" (std::unique_ptr< SparsePermutation > permutation)</dt><dd> \anchor _todo002285 (user): Currently this can only be called before PropagateNext() is
called (DCHECKed). Not sure if we need more incrementality though.
</dd> <dt>
\_setscope operations_research::sat::TimeTablingPerTask Class \_internalref classoperations__research_1_1sat_1_1TimeTablingPerTask "operations_research::sat::TimeTablingPerTask" </dt><dd> \anchor _todo002311 (user): Use SchedulingDemandHelper. In particular, if we know the task
is from a set of fixed alternatives, we might be able to push it more.
</dd> <dt>
\_setscope operations_research::sat::TimeTablingPerTask Member \_internalref classoperations__research_1_1sat_1_1TimeTablingPerTask#a3e048be6a5e38900071af4c347b0dff9 "operations_research::sat::TimeTablingPerTask::TimeTablingPerTask" (AffineExpression capacity, SchedulingConstraintHelper *helper, SchedulingDemandHelper *demands, Model *model)</dt><dd> \anchor _todo002306 (user): This usually correspond to a makespan interval.
We should just detect and propagate it separately as it would result
in a faster propagation.
</dd> <dt>
\_setscope operations_research::sat::TopN Class \_internalref classoperations__research_1_1sat_1_1TopN "operations_research::sat::TopN< Element, Score >" </dt><dd> \anchor _todo002333 (user): We could use gtl::TopN when/if it gets open sourced. Note that
we might be slighlty faster here since we use an indirection and don't move
the Element class around as much.
</dd> <dt>
\_setscope operations_research::sat::TopN Member \_internalref classoperations__research_1_1sat_1_1TopN#aab2091998d8295f6ecc5fd5f2beeebbb "operations_research::sat::TopN< Element, Score >::Add" (Element e, Score score)</dt><dd> \anchor _todo002336 (user): We could delay that on the n + 1 push.
</dd> <dt>
\_setscope operations_research::sat::TopNCuts Class \_internalref classoperations__research_1_1sat_1_1TopNCuts "operations_research::sat::TopNCuts" </dt><dd> \anchor _todo001818 (user): Avoid computing efficacity twice.
<p> <p>(user): We don't use any orthogonality consideration here.
<p> <p>(user): Detect duplicate cuts?
</dd> <dt>
\_setscope operations_research::sat::Trail Member \_internalref classoperations__research_1_1sat_1_1Trail#af94a42301fbeb5da23fdfd2c914f2a01 "operations_research::sat::Trail::Resize" (int num_variables)</dt><dd> \anchor _todo002123 (user): these vectors are not always used. Initialize them
dynamically.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a8fc9e60de9ebec04b0d8e62c0bcd7aa1 "operations_research::sat::TransformToGeneratorOfStabilizer" (int to_stabilize, std::vector< std::unique_ptr< SparsePermutation > > *generators)</dt><dd> \anchor _todo002290 (user): Implement!
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7e710c5266505c51982912036c840755 "operations_research::sat::TryToLinearizeConstraint" (const CpModelProto &model_proto, const ConstraintProto &ct, int linearization_level, Model *model, LinearRelaxation *relaxation, ActivityBoundHelper *helper=nullptr)</dt><dd> \anchor _todo001911 (user): Use the same pattern as the other 2 scheduling methods:
- single function
- generate helpers once<p> \anchor _todo001910 (user): In full generality, we could encode all the constraint as an LP.
<p> <p>(user): Add unit tests for this method.
<p> <p>(user): Remove and merge with model loading.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#aa5783ecb0b6b7f12fc2ea70339ec7acd "operations_research::sat::TryToReconcileEncodings" (const AffineExpression &size2_affine, const AffineExpression &affine, absl::Span< const ValueLiteralPair > affine_var_encoding, bool put_affine_left_in_result, IntegerEncoder *integer_encoder)</dt><dd> \anchor _todo001640 (user): I am not sure how this can happen since size2_affine is
supposed to be non-fixed. Maybe we miss some propag. Investigate.
<p> \anchor _todo001639 (user): Consider removing this once we are more complete in our implied
bounds repository. Because if we can reconcile an encoding, then any of the
literal in the at most one should imply a value on the boolean view use in
the size2 affine.
</dd> <dt>
\_setscope operations_research::sat::UpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1UpperBoundedLinearConstraint#a67f3b45ddd9ba6330059295e6258e4e6 "operations_research::sat::UpperBoundedLinearConstraint::AddToConflict" (MutableUpperBoundedLinearConstraint *conflict)</dt><dd> \anchor _todo002005 (user): Provides instead an easy to use iterator over an
UpperBoundedLinearConstraint and move this function to
MutableUpperBoundedLinearConstraint.
</dd> <dt>
\_setscope operations_research::sat::UpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1UpperBoundedLinearConstraint#a7e533d8923312b0d052abae98cab81b8 "operations_research::sat::UpperBoundedLinearConstraint::FillReason" (const Trail &trail, int source_trail_index, BooleanVariable propagated_variable, std::vector< Literal > *reason)</dt><dd> \anchor _todo002004 (user): Maybe it is possible to derive a better reason by using more
information. For instance one could use the mask of literals that are
better to use during conflict minimization (namely the one already in the
1-UIP conflict).
</dd> <dt>
\_setscope operations_research::sat::UpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1UpperBoundedLinearConstraint#ab83a887ed56694501b3e60f573db6d74 "operations_research::sat::UpperBoundedLinearConstraint::InitializeRhs" (Coefficient rhs, int trail_index, Coefficient *threshold, Trail *trail, PbConstraintsEnqueueHelper *helper)</dt><dd> \anchor _todo001990 (user): The source trail index for the propagation reason (i.e.
max_relevant_trail_index) may be higher than necessary (for some of the
propagated literals). Currently this works with FillReason(), but it was a
source of a really nasty bug (see CL 68906167) because of the (rhs == 1)
optim. Find a good way to test the logic.
</dd> <dt>
\_setscope operations_research::sat::UpperBoundedLinearConstraint Member \_internalref classoperations__research_1_1sat_1_1UpperBoundedLinearConstraint#a0d48dc8a24a03dea028d9f0e62ee257f "operations_research::sat::UpperBoundedLinearConstraint::ResolvePBConflict" (const Trail &trail, BooleanVariable var, MutableUpperBoundedLinearConstraint *conflict, Coefficient *conflict_slack)</dt><dd> \anchor _todo001994 (user): track the cancelation here so we can update
*conflict_slack properly.
<p> \anchor _todo001993 (user): The best will be to relax as little as possible.
<p> \anchor _todo001992 (user): If there is more "cancelation" than the min_coeffs below when
we add the two constraints, the resulting slack may be even lower. Taking
that into account is probably good.
<p> \anchor _todo001991 (user): Investigate if this is a good idea. It doesn't happen often,
but does happened. Maybe we can detect this before in Propagate()? The
setup is:
- At a given trail_index, var is propagated and added on the trail.
- There is some constraint literals assigned to true with a trail index
in (trail_index, var.trail_index).
- Their sum is high enough to cause a conflict.
- But individually, their coefficients are too small to be propagated, so
the conflict is not yet detected. It will be when these variables are
processed by PropagateNext().
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2eec7d4958da587ee893e334ab7756cc "operations_research::sat::ValidateCpModel" (const CpModelProto &model, bool after_presolve)</dt><dd> \anchor _todo001104 (user): Add any needed overflow validation because we are far from
exhaustive. We could also run a small presolve that tighten variable bounds
before the overflow check to facilitate the lives of our users, but it is a
some work to put in place.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a2073b9c892ac56b197b31cb583e25f3d "operations_research::sat::ValidateInputCpModel" (const SatParameters ¶ms, const CpModelProto &model)</dt><dd> \anchor _todo001105 (user): Ideally we would have just one ValidateCpModel() function but
this was introduced after many users already use ValidateCpModel() without
parameters.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#ad582c9543b77917ac1084bbfda601f5e "operations_research::sat::ValidateLinearConstraintForOverflow" (const LinearConstraint &constraint, const IntegerTrail &integer_trail)</dt><dd> \anchor _todo001801 (user): Avoid duplication with PossibleIntegerOverflow() in the checker?
At least make sure the code is the same.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a80f1b6bbf960239725bec385f09a5b14 "operations_research::sat::ValidateParameters" (const SatParameters ¶ms)</dt><dd> \anchor _todo001983 (user): Consider using annotations directly in the proto for these
validation. It is however not open sourced.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a007d129b4917935f84c9ae0823c2cb11 "operations_research::sat::VarDebugString" (const CpModelProto &proto, int index)</dt><dd> \anchor _todo001101 (user): unfortunately, we need this indirection to get a DebugString()
in a const way from an index. Because building an IntVar is non-const.
<p> \anchor _todo001102 (user): Use domain pretty print function.
</dd> <dt>
\_setscope operations_research::sat::VarDomination Class \_internalref classoperations__research_1_1sat_1_1VarDomination "operations_research::sat::VarDomination" </dt><dd> \anchor _todo002356 (user): We have a lot of benchmarks and tests that shows that we don't
report wrong relations, but we lack unit test that make sure we don't miss
any. Try to improve the situation.
</dd> <dt>
\_setscope operations_research::sat::VarDomination Member \_internalref classoperations__research_1_1sat_1_1VarDomination#ab03b7579b6f0728fd7c98fccae5196ed "operations_research::sat::VarDomination::EndFirstPhase" ()</dt><dd> \anchor _todo002337 (user): Use more heuristics to not miss as much dominance relation when
we crop initial lists.
<p> \anchor _todo002338 (user): Tune the initial size, 50 might be a bit large, since our
complexity is borned by this number times the number of entries in the
constraints. Still we should in most situation be a lot lower than that.
<p> \anchor _todo002339 (user): Maybe we should do that with all lists in case the
input function are called with duplicates too.
</dd> <dt>
\_setscope operations_research::sat::VariableWithSameReasonIdentifier Class \_internalref classoperations__research_1_1sat_1_1VariableWithSameReasonIdentifier "operations_research::sat::VariableWithSameReasonIdentifier" </dt><dd> \anchor _todo002001 (user): With the new SAME_REASON_AS mechanism, this is more general so
move out of pb_constraint.
</dd> <dt>
\_setscope operations_research::sat Member \_internalref namespaceoperations__research_1_1sat#a7eda39f480a5f8b2fca3c10db2045a13 "operations_research::sat::WeightedSumNotEqual" )(const std::vector< IntegerVariable > &vars, const VectorInt &coefficients, int64_t value)</dt><dd> \anchor _todo001725 (user): Simplify if the constant is at the edge of the possible values.
</dd> <dt>
\_setscope operations_research::sat::ZeroHalfCutHelper Member \_internalref classoperations__research_1_1sat_1_1ZeroHalfCutHelper#a58a0ce20218c3abd705302dd4de5474f "operations_research::sat::ZeroHalfCutHelper::AddOneConstraint" (glop::RowIndex, absl::Span< const glop::ColIndex > cols, absl::Span< const IntegerValue > coeffs, IntegerValue lb, IntegerValue ub)</dt><dd> \anchor _todo002363 (user): Avoid adding duplicates and just randomly pick one. Note
that we should also remove duplicate in a generic way.
<p> \anchor _todo002362 (user): experiment with the best value. probably only tight rows are
best? and we could use the basis status rather than recomputing the
activity for that.</dd> <dt>
\_setscope operations_research::sat::ZeroHalfCutHelper Member \_internalref classoperations__research_1_1sat_1_1ZeroHalfCutHelper#a67c63ecc26af5761893b5b5e93e7c5dd "operations_research::sat::ZeroHalfCutHelper::ProcessVariables" (const std::vector< double > &lp_values, absl::Span< const IntegerValue > lower_bounds, absl::Span< const IntegerValue > upper_bounds)</dt><dd> \anchor _todo002365 (user): This is a first implementation, both the heuristic and the
code performance can probably be improved uppon.
</dd> <dt>
\_setscope operations_research::sat::ZeroHalfCutHelper Member \_internalref classoperations__research_1_1sat_1_1ZeroHalfCutHelper#a33f87ee16f3556183d93b891e7f21fe1 "operations_research::sat::ZeroHalfCutHelper::SymmetricDifference" (const std::vector< int > &a, std::vector< int > *b)</dt><dd> \anchor _todo002364 (user): optim by doing that at the end?
</dd> <dt>
\_setscope operations_research::SatInterface Member \_internalref classoperations__research_1_1SatInterface#aa26cae7629efd16954fcc84081c98410 "operations_research::SatInterface::SetPresolveMode" (int value) override</dt><dd> \anchor _todo000798 (user): Implement me.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a50184e31fae8568937f4d891a7f6582b "operations_research::SatSolveProto" (MPModelRequest request, std::atomic< bool > *interrupt_solve, std::function< void(const std::string &)> logging_callback, std::function< void(const MPSolution &)> solution_callback)</dt><dd> \anchor _todo000790 (user): We do not support all the parameters here. In particular the
logs before the solver is called will not be appended to the response. Fix
that, and remove code duplication for the logger config. One way should be
to not touch/configure anything if the logger is already created while
calling SolveCpModel() and call a common config function from here or from
inside Solve()?
<p> \anchor _todo000793 (user): Remove the postsolve hack of copying to a response.
<p> \anchor _todo000792 (user): Implement the row and column status.
<p> \anchor _todo000791 (user): We put the INFEASIBLE_OR_UNBOUNBED case here since there
is no return status that exactly matches it.
</dd> <dt>
\_setscope operations_research::SavingsFilteredHeuristic::SavingsContainer Member \_internalref classoperations__research_1_1SavingsFilteredHeuristic_1_1SavingsContainer#a540b8ac71e4a7b1341ec7451e0a3df83 "operations_research::SavingsFilteredHeuristic::SavingsContainer< Saving >::Sort" ()</dt><dd> \anchor _todo000366 (user): Also do this when reiterating on next_savings_.
</dd> <dt>
\_setscope operations_research::ScipConstraintHandlerContext Member \_internalref classoperations__research_1_1ScipConstraintHandlerContext#ae4b686d5d1040fcf4db709e98a2022af "operations_research::ScipConstraintHandlerContext::is_pseudo_solution" () const</dt><dd> \anchor _todo000804 (user): maybe this can be abstracted away.
</dd> <dt>
\_setscope operations_research::ScipConstraintHandlerDescription Struct \_internalref structoperations__research_1_1ScipConstraintHandlerDescription "operations_research::ScipConstraintHandlerDescription" </dt><dd> \anchor _todo000803 (user): no effort has been made to optimize the default values of
enforcement_priority, feasibility_check_priority, eager_frequency, or
separation_priority.
</dd> <dt>
\_setscope operations_research::SCIPInterface Member \_internalref classoperations__research_1_1SCIPInterface#a8682d7f525de8a5c389cf5e1b495f1ac "operations_research::SCIPInterface::Solve" (const MPSolverParameters ¶m) override</dt><dd> \anchor _todo000807 (user): We could introduce our own "infeasible or unbounded" status.
<p> \anchor _todo000806 (user): I more or less copied this from the SCIPreadSol() code that
reads a solution from a file. I am not sure what SCIPisTransformed() is
or what is the difference between the try and add version. In any case
this seems to always call SCIPaddSolFree() for now and it works.
<p> \anchor _todo000805 (user): Is that still true now (2018) ?
</dd> <dt>
\_setscope operations_research::ScopedFloatingPointEnv Class \_internalref classoperations__research_1_1ScopedFloatingPointEnv "operations_research::ScopedFloatingPointEnv" </dt><dd> \anchor _todo002374 (user): Make it work on 32 bits.
<p> <p>(user): Make it work on msvc, currently calls to _controlfp crash.
</dd> <dt>
\_setscope operations_research::SequenceVar Member \_internalref classoperations__research_1_1SequenceVar#a9858103573f2d43dda6714eacfc2b76b "operations_research::SequenceVar::ComputePossibleFirstsAndLasts" (std::vector< int > *possible_firsts, std::vector< int > *possible_lasts)</dt><dd> \anchor _todo000377 (user): use domain iterator.
</dd> <dt>
\_setscope operations_research::SequenceVar Member \_internalref classoperations__research_1_1SequenceVar#ac6537f9c14b5450c8e44ec475bce71c7 "operations_research::SequenceVar::SequenceVar" (Solver *s, const std::vector< IntervalVar * > &intervals, const std::vector< IntVar * > &nexts, const std::string &name)</dt><dd> \anchor _todo000376 (user): Add better class invariants, in particular checks
that ranked_first, ranked_last, and unperformed are truly disjoint.
</dd> <dt>
\_setscope operations_research::SetCoverInvariant Member \_internalref classoperations__research_1_1SetCoverInvariant#aae2ad7cdc8baaeee65c58c4647899e0f "operations_research::SetCoverInvariant::ComputeImpactedSubsets" (SubsetIndex subset) const</dt><dd> \anchor _todo000054 (user): is it worth to precompute this?
</dd> <dt>
\_setscope operations_research::SetCoverInvariant Member \_internalref classoperations__research_1_1SetCoverInvariant#a3bf18bb03aa9822dd27b8db515a2097b "operations_research::SetCoverInvariant::RecomputeIsRemovable" ()</dt><dd> \anchor _todo000053 (user): reconsider exposing this.
</dd> <dt>
\_setscope operations_research::SetCoverMip Member \_internalref classoperations__research_1_1SetCoverMip#a67b99346dad8d9963a7e511760401bcb "operations_research::SetCoverMip::NextSolution" ()</dt><dd> \anchor _todo000055 (user): Add time-outs and exit with a partial solution. This seems
unlikely, though.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a759cbf01a64672ed6d944df33e681bc7 "operations_research::setobjoffset" (const XPRSprob &mLp, double value)</dt><dd> \anchor _todo000815 detect xpress version
</dd> <dt>
\_setscope operations_research::ShortestPathsOnDagWrapper Member \_internalref classoperations__research_1_1ShortestPathsOnDagWrapper#a9c283a125273e20ec98fc78c29c075c1 "operations_research::ShortestPathsOnDagWrapper< GraphType >::ArcPathTo" (NodeIndex node) const</dt><dd> \anchor _todo000620 (user): If <tt>ArcPathTo</tt> and/or <tt>NodePathTo</tt> functions become
bottlenecks:
(1) have the class preallocate a buffer of size <tt>num_nodes</tt>
(2) assign into an index rather than with push_back
(3) return by absl::Span (or return a copy) with known size.
</dd> <dt>
\_setscope operations_research::SimpleLinearSumAssignment Member \_internalref classoperations__research_1_1SimpleLinearSumAssignment#a613c560fdd07ae94350736adaf2dab56 "operations_research::SimpleLinearSumAssignment::Solve" ()</dt><dd> \anchor _todo000610 (user): Improve the LinearSumAssignment api to clearly define
the error cases.
</dd> <dt>
\_setscope operations_research::SimpleMaxFlow Class \_internalref classoperations__research_1_1SimpleMaxFlow "operations_research::SimpleMaxFlow" </dt><dd> \anchor _todo000662 (user): If the need arises, extend this interface to support warm start.
</dd> <dt>
\_setscope operations_research::SimpleMaxFlow Member \_internalref classoperations__research_1_1SimpleMaxFlow#a8a7acde49c4d55f2eb42e2b6869cdb3da18a3ff25435f10be68329d4b39de4700 "operations_research::SimpleMaxFlow::POSSIBLE_OVERFLOW" </dt><dd> \anchor _todo000665 (user): rename POSSIBLE_OVERFLOW to INT_OVERFLOW and modify our
clients.
</dd> <dt>
\_setscope operations_research::SimpleMaxFlow Member \_internalref classoperations__research_1_1SimpleMaxFlow#a57296b653813abdd8d711048e87d1212 "operations_research::SimpleMaxFlow::SetArcCapacity" (ArcIndex arc, FlowQuantity capacity)</dt><dd> \anchor _todo000664 (user): Support incrementality in the max flow implementation.
</dd> <dt>
\_setscope operations_research::SimpleMinCostFlow Class \_internalref classoperations__research_1_1SimpleMinCostFlow "operations_research::SimpleMinCostFlow" </dt><dd> \anchor _todo000677 (user): If the need arises, extend this interface to support warm start
and incrementality between solves. Note that this is already supported by the
GenericMinCostFlow<> interface.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#ae1b6e8c0d3d27218470118e9182605ed "operations_research::SolveModelWithSat" (RoutingModel *model, const RoutingSearchParameters &search_parameters, const Assignment *initial_solution, Assignment *solution)</dt><dd> \anchor _todo000344 (user): Check that performance is acceptable.
<p> \anchor _todo000343 (user): Check that performance is acceptable.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a7e046b2bebd1a0d36b25ec6a97a0ee4e "operations_research::SolveMPModel" (const MPModelRequest &model_request, std::atomic< bool > *interrupt)</dt><dd> \anchor _todo000810 (b/311704821): this function should not delegate to MPSolver, also true
for the functions below.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a7b45e72a8b9152d7ac862a2ed80bc749 "operations_research::Solver::Action" )</dt><dd> \anchor _todo000131 (user): wrap in swig.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a38d14a90db2f0ae3bc1563d453e4f93e "operations_research::Solver::AddPropagationMonitor" (PropagationMonitor *monitor)</dt><dd> \anchor _todo000127 (user): Check solver state?
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#aa290140ba6c4d6ef672c792a63bad57c "operations_research::Solver::ClearNeighbors" ()</dt><dd> \anchor _todo000133 (user): Find a workaround to avoid exposing this.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a00ddb4cf5be5463ec6b494808bc8f192 "operations_research::Solver::DefaultSolverParameters" ()</dt><dd> \anchor _todo000132 (user): Move to constraint_solver_parameters.h.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#ae3b660d3dece402d0ca5448d127c0f6f "operations_research::Solver::GetOrCreateLocalSearchState" ()</dt><dd> \anchor _todo000149 (user): Investigate if this should be moved to Search.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#aeb2e6947882d148bfaece200f5c6b131 "operations_research::Solver::InstrumentsDemons" () const</dt><dd> \anchor _todo000122 (user): remove this complex logic.
We need the double test because parameters are set too late when using
python in the open source. This is the cheapest work-around.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#ae63acd77b8c2ee40387795051298f659 "operations_research::Solver::IntValueStrategy" </dt><dd> \anchor _todo000130 (user): add HIGHEST_MIN and LOWEST_MAX.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a64fd8adbc00c3bed16bf4b824dfd3e2b "operations_research::Solver::LocalSearchProfile" () const</dt><dd> \anchor _todo000147 (user): Merge demon and local search profiles.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a579ddb4232150f04e17c0852fc8e1c60 "operations_research::Solver::MakeCircuit" (const std::vector< IntVar * > &nexts)</dt><dd> \anchor _todo000201 (user): Merge NoCycle and Circuit.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#aa1b2edf76ef068b3d1cc8b56f7e7af23 "operations_research::Solver::MakeDelayedPathCumul" (const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, const std::vector< IntVar * > &cumuls, const std::vector< IntVar * > &transits)</dt><dd> \anchor _todo000138 (user): Merge with other path-cumuls constraints.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a0132207ac0371c18971693c8a6d9b29c "operations_research::Solver::MakeDistribute" (const std::vector< IntVar * > &vars, const std::vector< int64_t > &values, const std::vector< IntVar * > &cards)</dt><dd> \anchor _todo000162 (user) : we can sort values (and cards) before doing the test.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a0ceffed2d421a344403f5a8366baa136 "operations_research::Solver::MakeDiv" (IntExpr *expr, int64_t value)</dt><dd> \anchor _todo000182 (user) : implement special case.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a0ab2b02352f4ab51aeb392314d7b60a5 "operations_research::Solver::MakeIsEqualCstCt" (IntExpr *var, int64_t value, IntVar *boolvar)</dt><dd> \anchor _todo000177 (user) : what happens if the constraint is not posted?
The cache becomes tainted.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a10c9da29e0f571f2fac430761d133016 "operations_research::Solver::MakeLexicalLess" (const std::vector< IntVar * > &left, const std::vector< IntVar * > &right)</dt><dd> \anchor _todo000136 (user): Add void MakeSortedArray(
const std::vector<IntVar*>& vars,
std::vector<IntVar*>* const sorted);
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a79d9441a76ca41dce4b28ff9be616363 "operations_research::Solver::MakeLocalSearchPhase" (Assignment *assignment, LocalSearchPhaseParameters *parameters)</dt><dd> \anchor _todo000146 (user): Make a variant which runs a local search after each
solution found in a DFS.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#aa8c0e8504dd5125dd200e9e3d9ef1e75 "operations_research::Solver::MakeNoCycle" (const std::vector< IntVar * > &nexts, const std::vector< IntVar * > &active, IndexFilter1 sink_handler=nullptr)</dt><dd> \anchor _todo000137 (user): Implement MakeAllNullIntersect taking an array of
variable vectors.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#af6c9a69ab6f3bf11e703e91812d34223 "operations_research::Solver::MakeNotBetweenCt" (IntExpr *expr, int64_t l, int64_t u)</dt><dd> \anchor _todo000178 (user): Add back simplification code if expr is constant *
other_expr.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#abe4d40de1cffbeed5d0bbd8a875a83b1 "operations_research::Solver::MakeOperator" (const std::vector< IntVar * > &vars, LocalSearchOperators op, std::function< const std::vector< int > &(int, int)> get_neighbors=nullptr)</dt><dd> \anchor _todo000221 (user): Remove (parts of) the following methods as they are mostly
redundant with the MakeLocalSearchOperatorWithNeighbors and
MakeLocalSearchOperator functions.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#ac78afa51e3d5d28e84916a6fc47375de "operations_research::Solver::MakeOperator" (const std::vector< IntVar * > &vars, IndexEvaluator3 evaluator, EvaluatorLocalSearchOperators op)</dt><dd> \anchor _todo000145 (user): Make the callback an IndexEvaluator2 when there are no
secondary variables.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a0456a638eb3c86b7e3c6bbcc6f1a961c "operations_research::Solver::MakePathConnected" (std::vector< IntVar * > nexts, std::vector< int64_t > sources, std::vector< int64_t > sinks, std::vector< IntVar * > status)</dt><dd> \anchor _todo000139 (user): Only does checking on WhenBound events on next variables.
Check whether more propagation is needed.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a793b6001916186ac1d7041a10fdd41d6 "operations_research::Solver::MakePathPrecedenceConstraint" (std::vector< IntVar * > nexts, const std::vector< std::pair< int, int > > &precedences)</dt><dd> \anchor _todo000140 (user): This constraint does not make holes in variable domains;
the implementation can easily be modified to do that; evaluate the impact
on models solved with local search.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a039ebfef32db8ee5641b25328954cce9 "operations_research::Solver::MakePhase" (const std::vector< IntVar * > &vars, IndexEvaluator2 eval, IndexEvaluator1 tie_breaker, EvaluatorStrategy str)</dt><dd> \anchor _todo000381 (user): support tie breaker
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a66461677e91be7682f36b8660889fd2f "operations_research::Solver::MakePhase" (const std::vector< IntVar * > &vars, IntVarStrategy var_str, IntValueStrategy val_str)</dt><dd> \anchor _todo000144 (user): name each of them differently, and document them (and do that
for all other functions that have several homonyms in this .h).
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a84584b7705a787a70e09341e4a0e30f5 "operations_research::Solver::MakePiecewiseLinearExpr" (IntExpr *expr, const PiecewiseLinearFunction &f)</dt><dd> \anchor _todo000134 (user): Investigate if we can merge all three piecewise linear
expressions.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#ac9865c3135d8b9b3f7de73c92dac53a4 "operations_research::Solver::MakeSearchLog" (int branch_period)</dt><dd> \anchor _todo000142 (user): DEPRECATE API of MakeSearchLog(.., IntVar* var,..).
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#afbef3a751ed2de0600ef603df8dbc16f "operations_research::Solver::MakeSemiContinuousExpr" (IntExpr *expr, int64_t fixed_charge, int64_t step)</dt><dd> \anchor _todo000183 (user) : benchmark with virtualization of
PosIntDivDown and PosIntDivUp - or function pointers.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#acdd432e2ef445bb100f999ebb36e8d9c "operations_research::Solver::MakeSimulatedAnnealing" (bool maximize, IntVar *v, int64_t step, int64_t initial_temperature)</dt><dd> \anchor _todo000141 (user): document behavior
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a0d6603ccdf190d08e5eb55a383cb7f42 "operations_research::Solver::MakeSortingConstraint" (const std::vector< IntVar * > &vars, const std::vector< IntVar * > &sorted)</dt><dd> \anchor _todo000135 (user): Do we need a version with an array of escape values.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a4c57adb4aa21bbbb303282a2fb12a546 "operations_research::Solver::NewSearch" (DecisionBuilder *db, const std::vector< SearchMonitor * > &monitors)</dt><dd> \anchor _todo000125 (user): delete top level search after EndSearch().
<p> \anchor _todo000126 (user): Check if these two lines are still necessary.
<p> \anchor _todo000124 (user) : reset statistics
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#afa66a85cec14980401bb16d4f4a84aa1 "operations_research::Solver::SetUseFastLocalSearch" (bool use_fast_local_search)</dt><dd> \anchor _todo000148 (user): Get rid of the following methods once fast local search is
enabled for metaheuristics.
Disables/enables fast local search.
</dd> <dt>
\_setscope operations_research::Solver Member \_internalref classoperations__research_1_1Solver#a904f4c25cf6302fc577889db54b240cc "operations_research::Solver::Try" (DecisionBuilder *db1, DecisionBuilder *db2)</dt><dd> \anchor _todo000143 (user): The search tree can be balanced by using binary
"Try"-builders "recursively". For instance, Try(a,b,c,d) will give a tree
unbalanced to the right, whereas Try(Try(a,b), Try(b,c)) will give a
balanced tree. Investigate if we should only provide the binary version
and/or if we should balance automatically.
</dd> <dt>
\_setscope operations_research::SolverLogger Member \_internalref classoperations__research_1_1SolverLogger#a596c5e6e999145f99d9afdb60ef52c84 "operations_research::SolverLogger::FlushPendingThrottledLogs" (bool ignore_rates=false)</dt><dd> \anchor _todo002377 (user): If this is called too often, we could optimize it and do
nothing if there are no skipped logs.
</dd> <dt>
\_setscope operations_research::SortedDisjointIntervalList Class \_internalref classoperations__research_1_1SortedDisjointIntervalList "operations_research::SortedDisjointIntervalList" </dt><dd> \anchor _todo002397 (user): Templatize the class on the type of the bounds.
</dd> <dt>
\_setscope operations_research::SortedDisjointIntervalList Member \_internalref classoperations__research_1_1SortedDisjointIntervalList#a53aa27777a48b981046ad09b97bded60 "operations_research::SortedDisjointIntervalList::InsertInterval" (int64_t start, int64_t end)</dt><dd> \anchor _todo002394 (user): tune the algorithm below if it proves to be a bottleneck.
For example, one could try to avoid an insertion if it's not needed
(when the interval merges with a single existing interval or is fully
contained by one).
</dd> <dt>
\_setscope operations_research::SortedDisjointIntervalList Member \_internalref classoperations__research_1_1SortedDisjointIntervalList#ad937d5864aa7a209f5c565a49daad904 "operations_research::SortedDisjointIntervalList::InsertIntervals" (const std::vector< int > &starts, const std::vector< int > &ends)</dt><dd> \anchor _todo002395 (user): treat kint32min and kint32max as their kint64 variants.
</dd> <dt>
\_setscope operations_research::SortedDisjointIntervalList Member \_internalref classoperations__research_1_1SortedDisjointIntervalList#a592c99d8ddbc2a357683903882c437ba "operations_research::SortedDisjointIntervalList::SortedDisjointIntervalList" (const std::vector< int64_t > &starts, const std::vector< int64_t > &ends)</dt><dd> \anchor _todo002398 (user): Explain why we favored this API to the more natural
input std::vector<ClosedInterval> or std::vector<std::pair<int, int>>.
</dd> <dt>
\_setscope operations_research::SparsePermutation Member \_internalref classoperations__research_1_1SparsePermutation#a9fc0ca5752b5ad6cc2a78ff7c512b22a "operations_research::SparsePermutation::LastElementInCycle" (int i) const</dt><dd> \anchor _todo000062 (user): Provide a full iterator for this? Note that we have more
information with the loop above. Not sure it is needed though.
</dd> <dt>
\_setscope operations_research::SparsePermutation Member \_internalref classoperations__research_1_1SparsePermutation#a1190fc1695811df74812b7fb1051f3bc "operations_research::SparsePermutation::RemoveCycles" (absl::Span< const int > cycle_indices)</dt><dd> \anchor _todo000060 (user): make this a class member to avoid allocation if the complexity
becomes an issue. In this case, also optimize the loop below by not copying
the first cycles.
</dd> <dt>
\_setscope operations_research::SparsePermutation Member \_internalref classoperations__research_1_1SparsePermutation#aff385d18c768ffa364c5dccb5fb35c0a "operations_research::SparsePermutation::Size" () const</dt><dd> \anchor _todo000061 (user): complete the reader API.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a93f8f72c3931f60faed67abfe9b85f3e "operations_research::splitMyString" (const std::string &str, Container &cont, char delim=' ')</dt><dd> \anchor _todo000823 useless ?
</dd> <dt>
\_setscope operations_research::SteepestSearch Member \_internalref classoperations__research_1_1SteepestSearch#a7b76a69a07f9abf4e7cd0ff88925208d "operations_research::SteepestSearch::NextSolution" (int num_iterations)</dt><dd> \anchor _todo000048 (user): Add time-outs and exit with a partial solution.
</dd> <dt>
\_setscope operations_research Member \_internalref namespaceoperations__research#a4f740c94953f253d0a3b27ae3996e001 "operations_research::SubsetCostVector" </dt><dd> \anchor _todo000056 (user): consider replacing with StrongVectors, which behave differently.
The return type for size() is a simple size_t and not an Index as in
StrictITIVector, which makes the code less elegant.
</dd> <dt>
\_setscope operations_research::SubsetPriorityQueue Member \_internalref classoperations__research_1_1SubsetPriorityQueue#afc15acdd067fd3c289892500bd43e83b "operations_research::SubsetPriorityQueue::ChangePriority" (SubsetIndex subset, Cost priority)</dt><dd> \anchor _todo000059 (user): see if the reference to inv_ can be removed.
</dd> <dt>
\_setscope operations_research::SwapActiveToShortestPathOperator Class \_internalref classoperations__research_1_1SwapActiveToShortestPathOperator "operations_research::SwapActiveToShortestPathOperator" </dt><dd> \anchor _todo000340 (user): Support vehicle-class-dependent arc_evaluators.
</dd> <dt>
\_setscope operations_research::SymmetryManager Member \_internalref classoperations__research_1_1SymmetryManager#a6f8f0310d17cfdf227de35d5eaeb6ec2 "operations_research::SymmetryManager::CheckSymmetries" (int index)</dt><dd> \anchor _todo000390 (user) : Improve speed, cache previous min and build them
incrementally.
</dd> <dt>
\_setscope operations_research::TimeDistribution Class \_internalref classoperations__research_1_1TimeDistribution "operations_research::TimeDistribution" </dt><dd> \anchor _todo002399 (user): Since we inherit from DistributionStat, we currently store the
sum of CPU cycles as a double internally. A better option is to use int64_t
because with the 53 bits of precision of a double, we will run into an issue
if the sum of times reaches 52 days for a 2GHz processor.
</dd> <dt>
\_setscope operations_research::TimeLimit Class \_internalref classoperations__research_1_1TimeLimit "operations_research::TimeLimit" </dt><dd> \anchor _todo002401 (user): The expression "deterministic time" should be replaced with
"number of operations" to avoid confusion with "real" time.
</dd> <dt>
\_setscope operations_research::TrivialSolutionGenerator Class \_internalref classoperations__research_1_1TrivialSolutionGenerator "operations_research::TrivialSolutionGenerator" </dt><dd> \anchor _todo000044 (user): make the different algorithms concurrent, solving independent
subproblems in different threads.</dd> <dt>
\_setscope operations_research::TrivialSolutionGenerator Member \_internalref classoperations__research_1_1TrivialSolutionGenerator#a72b5cae65519e7893e32e217ef056384 "operations_research::TrivialSolutionGenerator::NextSolution" ()</dt><dd> \anchor _todo000046 (user): Add time-outs and exit with a partial solution. This seems
unlikely, though.
</dd> <dt>
\_setscope operations_research::TspLibTourParser Member \_internalref classoperations__research_1_1TspLibTourParser#a35c4ff768d130b7f9303bc1a2f96a0d7 "operations_research::TspLibTourParser::LoadFile" (const std::string &file_name)</dt><dd> \anchor _todo001024 (user): Return false when issues were encountered while parsing the
file.
</dd> <dt>
\_setscope operations_research::XpressInterface Member \_internalref classoperations__research_1_1XpressInterface#a16607e74836faff69fe760ced72898ce "operations_research::XpressInterface::AddRowConstraint" (MPConstraint *ct) override</dt><dd> \anchor _todo000818
Make new constraints basic (rowstat[jrow]=1)
Try not to delete basic variables, or non-basic constraints.
</dd> <dt>
\_setscope operations_research::XpressInterface Member \_internalref classoperations__research_1_1XpressInterface#aa8856606b3e293087775ce7725e1dd99 "operations_research::XpressInterface::AddVariable" (MPVariable *var) override</dt><dd> \anchor _todo000819
Make new variables non-basic at their lower bound (colstat[icol]=0), unless
a variable has an infinite lower bound and a finite upper bound, in which
case make the variable non-basic at its upper bound (colstat[icol]=2) Try
not to delete basic variables, or non-basic constraints.
</dd> <dt>
\_setscope operations_research::XpressInterface Member \_internalref classoperations__research_1_1XpressInterface#a19631de62b2acb1c83d926ebea3c8e09 "operations_research::XpressInterface::ComputeExactConditionNumber" () const override</dt><dd> \anchor _todo000825 (user): Not yet working.
</dd> <dt>
\_setscope operations_research::XpressInterface Member \_internalref classoperations__research_1_1XpressInterface#a99b8c52ba056e774c77c291506de3da1 "operations_research::XpressInterface::ExtractNewVariables" () override</dt><dd> \anchor _todo000821 fixme
Writing all names worsen the performance significantly
if (have_names) {
CHECK_STATUS(XPRSaddnames(mLp, XPRS_NAMES_COLUMN,
col_names.data(), 0,
new_col_count - 1));
}
<p> \anchor _todo000820 : Use a bitarray to flag the constraints that actually
intersect new variables?
</dd> <dt>
\_setscope operations_research::XpressInterface Member \_internalref classoperations__research_1_1XpressInterface#ada4d7eb4cf0ff57af8f2585fe4dfbdf6 "operations_research::XpressInterface::SetVariableInteger" (int var_index, bool integer) override</dt><dd> \anchor _todo000816 : Should we check the current type and don't do anything
in case the type does not change?
</dd> <dt>
\_setscope operations_research::XpressInterface Member \_internalref classoperations__research_1_1XpressInterface#a6d7d562bf9d60d8006799f9f14d89afd "operations_research::XpressInterface::Solve" (MPSolverParameters const ¶m) override</dt><dd> \anchor _todo000822 : check number of variables / constraints
</dd> <dt>
\_setscope operations_research::XpressMPCallbackContext Member \_internalref classoperations__research_1_1XpressMPCallbackContext#a7aa4754c5d84c3a8eb47a8f1384bc29f "operations_research::XpressMPCallbackContext::SuggestSolution" (const absl::flat_hash_map< const MPVariable *, double > &solution) override</dt><dd> \anchor _todo000824 : remove this workaround when it is handled in XPRESS
</dd> <dt>
Member \_internalref scip__callback_8cc#a55103a9413973772f122a9c3dfef5030 "SCIP_DECL_CONSENFOPS" (EnforcePseudoSolutionC)</dt><dd> \anchor _todo000799 (user): are we sure the pseudo solution is LP feasible? It seems like
it doesn't need to be. The code in RunSeparation might assume this?
</dd> <dt>
Member \_internalref scip__callback_8cc#a2e5ec3c32f1a6cde27f8a3538ea801bd "SCIP_DECL_CONSLOCK" (VariableRoundingLockC)</dt><dd> \anchor _todo000800 (user): this could be a little better, but we would need to add
another method to override on ScipConstraintHandler<ConstraintData>.
</dd> <dt>
Member \_internalref routing_8cc#a9f7fbf98fe796946fe0be2ca5c8b4e50 "start_equivalence_class" </dt><dd> \anchor _todo000287 (user): Find equivalent start/end nodes wrt dimensions and
callbacks.
</dd> <dt>
\_setscope StronglyConnectedComponentsFinder Class \_internalref classStronglyConnectedComponentsFinder "StronglyConnectedComponentsFinder< NodeIndex, Graph, SccOutput >" </dt><dd> \anchor _todo000714 (user): Possible optimizations:
- Try to reserve the vectors which sizes are bounded by num_nodes.
- Use an index rather than doing push_back(), pop_back() on them.
</dd> <dt>
Member \_internalref timer_8h#a430398fcce7a0820817d8dae9c226d00 "UserTimer" </dt><dd> \anchor _todo000065 (user): implement it properly.
</dd> <dt>
\_setscope util::BaseGraph Member \_internalref classutil_1_1BaseGraph#a92ffd852b2ab2e5241f9832e71a2de71 "util::BaseGraph< NodeIndexType, ArcIndexType, HasReverseArcs >::arc_capacity" () const</dt><dd> \anchor _todo000627 (user): Same questions as the ones in node_capacity().
</dd> <dt>
\_setscope util::BaseGraph Member \_internalref classutil_1_1BaseGraph#aa3bd051d1e141b09dda17aa9b5f24f69 "util::BaseGraph< NodeIndexType, ArcIndexType, HasReverseArcs >::FreezeCapacities" ()</dt><dd> \anchor _todo000628 (user): Only define this in debug mode at the cost of having a lot
of ifndef NDEBUG all over the place? remove the function completely ?
</dd> <dt>
\_setscope util::BaseGraph Member \_internalref classutil_1_1BaseGraph#a07214b96597069d781e27b1dd17ef83e "util::BaseGraph< NodeIndexType, ArcIndexType, HasReverseArcs >::GroupForwardArcsByFunctor" (const A &a, B *b)</dt><dd> \anchor _todo000630 (user): remove the public functions below. They are just here during
the transition from the old ebert_graph api to this new graph api.
</dd> <dt>
\_setscope util::BaseGraph Member \_internalref classutil_1_1BaseGraph#a463d57480c9563a7a707c5d0928c9946 "util::BaseGraph< NodeIndexType, ArcIndexType, HasReverseArcs >::node_capacity" () const</dt><dd> \anchor _todo000626 (user): Is it needed? remove completely? return the real capacities
at the cost of having a different implementation for each graphs?
</dd> <dt>
\_setscope util Member \_internalref namespaceutil#a628255019800e5a053d08b1f0c5a05f2 "util::EqualRange" (MultiMap &multi_map, const typename MultiMap::key_type &key)</dt><dd> \anchor _todo000649 (user): go further and expose only the values, not the pairs (key,
values) since the caller already knows the key.
</dd> <dt>
\_setscope util::graph Member \_internalref namespaceutil_1_1graph#a440afdf238e5a752bbe4e1bcc8878fe7 "util::graph::FindCycleInGraph" (const AdjacencyLists &adj)</dt><dd> \anchor _todo000715 (user): Caching adj[cur_state->node] in a local stack to improve
locality and so that the [] operator is called exactly once per node.
</dd> <dt>
\_setscope util Member \_internalref namespaceutil#a9470623ca7db3c4a62ce3b326c6b07d8 "util::PermuteWithExplicitElementType" (const IntVector &permutation, Array *array_to_permute, ElementType unused)</dt><dd> \anchor _todo000625 (user): consider slower but more memory efficient implementations that
follow the cycles of the permutation and use a bitmap to indicate what has
been permuted or to mark the beginning of each cycle.
</dd> <dt>
\_setscope util Member \_internalref namespaceutil#a06fa201576c927d92657e090fa86bfdb "util::RemoveCyclesFromPath" (const Graph &graph, std::vector< int > *arc_path)</dt><dd> \anchor _todo000716 (user): In some cases, there is more than one possible solution. We could
take some arc costs and return the cheapest path instead. Or return the
shortest path in term of number of arcs.
</dd> <dt>
\_setscope util::ReverseArcMixedGraph Member \_internalref classutil_1_1ReverseArcMixedGraph#a5ebe11f2abcd78ad1f5606e27d1688bb "util::ReverseArcMixedGraph< NodeIndexType, ArcIndexType >::Head" (ArcIndexType arc) const</dt><dd> \anchor _todo000632 (user): support Head() and Tail() before Build(), like StaticGraph<>.
</dd> <dt>
\_setscope util::ReverseArcMixedGraph::OutgoingArcIterator Member \_internalref classutil_1_1ReverseArcMixedGraph_1_1OutgoingArcIterator#ac265893b8e1a6db1380522442bf66c84 "util::ReverseArcMixedGraph< NodeIndexType, ArcIndexType >::OutgoingArcIterator::DEFINE_STL_ITERATOR_FUNCTIONS" (OutgoingArcIterator)</dt><dd> \anchor _todo000636 (user): we lose a bit by returning a BeginEndWrapper<> on top of this
iterator rather than a simple IntegerRange on the arc indices.
</dd> <dt>
\_setscope util::ReverseArcStaticGraph Member \_internalref classutil_1_1ReverseArcStaticGraph#a590ee70b96ce87433ba89b067495aa5f "util::ReverseArcStaticGraph< NodeIndexType, ArcIndexType >::Build" (std::vector< ArcIndexType > *permutation)</dt><dd> \anchor _todo000629 (user): the 0 is wasted here, but minor optimisation.
</dd> <dt>
\_setscope util::ReverseArcStaticGraph Member \_internalref classutil_1_1ReverseArcStaticGraph#a72e8ed03fe3f8ff27d156622a86900aa "util::ReverseArcStaticGraph< NodeIndexType, ArcIndexType >::Head" (ArcIndexType arc) const</dt><dd> \anchor _todo000631 (user): support Head() and Tail() before Build(), like StaticGraph<>.
</dd> <dt>
\_setscope util::ReverseArcStaticGraph::OutgoingArcIterator Member \_internalref classutil_1_1ReverseArcStaticGraph_1_1OutgoingArcIterator#a4f7501971b3fcc6ab34772a93c449ac6 "util::ReverseArcStaticGraph< NodeIndexType, ArcIndexType >::OutgoingArcIterator::DEFINE_STL_ITERATOR_FUNCTIONS" (OutgoingArcIterator)</dt><dd> \anchor _todo000635 (user): we lose a bit by returning a BeginEndWrapper<> on top of this
iterator rather than a simple IntegerRange on the arc indices.
</dd> <dt>
\_setscope util::SVector Member \_internalref classutil_1_1SVector#a287f9791ba2e68e137d53fc038bbe432 "util::SVector< T >::reserve" (int n)</dt><dd> \anchor _todo000633 (user): in C++17 we could use std::uninitialized_move instead
of this loop.
</dd> <dt>
Member \_internalref parser_8tab_8cc#ad3cdc959806aba1ada0fd7e5d4184f88 "yyparse" (operations_research::fz::ParserContext *context, operations_research::fz::Model *model, bool *ok, void *scanner) (user): CHECK all values within domain.
(user): CHECK all values within domain.
(user): Check that the assignment is included in the domain.
(user): check that all assignments are included in the domain.