diff --git a/examples/max_flow.rs b/examples/max_flow.rs index 215d38a1..294434d2 100644 --- a/examples/max_flow.rs +++ b/examples/max_flow.rs @@ -143,7 +143,7 @@ where F: SparseElement + Zero + Eq + NonZero, { type Column = Column; - type Cost<'a> = Cost; + type Cost<'a> where Self: 'a = Cost; type Rhs = F; fn column(&self, j: usize) -> Self::Column { diff --git a/src/algorithm/mod.rs b/src/algorithm/mod.rs index edb8c5c7..5ba4a882 100644 --- a/src/algorithm/mod.rs +++ b/src/algorithm/mod.rs @@ -22,16 +22,16 @@ pub trait SolveRelaxation: MatrixProvider { /// # Return value /// /// Whether the problem is feasible, and if so, a solution if the problem is bounded. - fn solve_relaxation(&self) -> OptimizationResult + fn solve_relaxation<'provider, IM>(&'provider self) -> OptimizationResult where IM: InverseMaintener::F> + im_ops::Cost + + im_ops::Cost> + im_ops::Rhs + im_ops::Column + >, - for<'r> IM::F: im_ops::Cost>, ; } diff --git a/src/algorithm/two_phase/matrix_provider/column/mod.rs b/src/algorithm/two_phase/matrix_provider/column/mod.rs index 6c1a3360..3360cf20 100644 --- a/src/algorithm/two_phase/matrix_provider/column/mod.rs +++ b/src/algorithm/two_phase/matrix_provider/column/mod.rs @@ -36,7 +36,7 @@ pub trait Column: ColumnIntoIterator + Debug { /// Type of struct to iterate over this column. /// /// It should be somewhat cheaply cloneable and as such not be too large. - type Iter<'a>: ColumnIterator<'a, F=Self::F>; + type Iter<'a>: ColumnIterator<'a, F=Self::F> where Self: 'a; /// Derive the iterator object. /// diff --git a/src/algorithm/two_phase/matrix_provider/filter/generic_wrapper.rs b/src/algorithm/two_phase/matrix_provider/filter/generic_wrapper.rs index a7e2b529..069edb4b 100644 --- a/src/algorithm/two_phase/matrix_provider/filter/generic_wrapper.rs +++ b/src/algorithm/two_phase/matrix_provider/filter/generic_wrapper.rs @@ -226,7 +226,7 @@ where MP: MatrixProvider, { type Column = ::Filtered; - type Cost<'a> = MP::Cost<'a>; + type Cost<'a> where Self: 'a = MP::Cost<'provider>; type Rhs = MP::Rhs; fn column(&self, j: usize) -> Self::Column { diff --git a/src/algorithm/two_phase/matrix_provider/filter/mod.rs b/src/algorithm/two_phase/matrix_provider/filter/mod.rs index 1d55f361..f26c573a 100644 --- a/src/algorithm/two_phase/matrix_provider/filter/mod.rs +++ b/src/algorithm/two_phase/matrix_provider/filter/mod.rs @@ -18,7 +18,7 @@ pub trait Filtered: MatrixProvider { /// Derive a variant of the matrix provider that has rows removed from it. pub trait ToFiltered: MatrixProvider { /// The resulting matrix provider type. - type Filtered<'provider>: Filtered::F>>; + type Filtered<'provider>: Filtered::F>> where Self: 'provider; /// Derive a variant of the matrix provider that has rows removed from it. /// diff --git a/src/algorithm/two_phase/matrix_provider/matrix_data.rs b/src/algorithm/two_phase/matrix_provider/matrix_data.rs index 05661eb2..fd630199 100644 --- a/src/algorithm/two_phase/matrix_provider/matrix_data.rs +++ b/src/algorithm/two_phase/matrix_provider/matrix_data.rs @@ -284,7 +284,7 @@ where for<'r> &'r F: FieldRef, { type Column = Column; - type Cost<'a> = Option<&'a ::F>; + type Cost<'a> where Self: 'a = Option<&'a ::F>; type Rhs = F; #[inline] diff --git a/src/algorithm/two_phase/matrix_provider/mod.rs b/src/algorithm/two_phase/matrix_provider/mod.rs index f8b3b5d8..8274af37 100644 --- a/src/algorithm/two_phase/matrix_provider/mod.rs +++ b/src/algorithm/two_phase/matrix_provider/mod.rs @@ -45,7 +45,7 @@ pub trait MatrixProvider { /// /// This type will often be of the form `Option<_>` so to not have to store any zero values, the /// inner type would never be zero in that case. - type Cost<'a>; + type Cost<'a> where Self: 'a; /// Right hand side type. type Rhs: ops::Rhs; diff --git a/src/algorithm/two_phase/mod.rs b/src/algorithm/two_phase/mod.rs index cebba80f..5ee5530d 100644 --- a/src/algorithm/two_phase/mod.rs +++ b/src/algorithm/two_phase/mod.rs @@ -27,15 +27,15 @@ where MP: MatrixProvider, { // TODO(ENHANCEMENT): Specialize for MatrixProviders that can be filtered directly. - default fn solve_relaxation(&self) -> OptimizationResult + default fn solve_relaxation<'provider, IM>(&'provider self) -> OptimizationResult where IM: InverseMaintener::Column as Column>::F> + im_ops::Cost + + im_ops::Cost> + im_ops::Rhs + >, - for<'r> IM::F: im_ops::Cost>, { match self.compute_bfs_giving_im::() { RankedFeasibilityResult::Feasible { @@ -84,15 +84,15 @@ where MP: MatrixProvider, MP::Rhs: 'static + ColumnNumber, { - fn solve_relaxation(&self) -> OptimizationResult + fn solve_relaxation<'provider, IM>(&'provider self) -> OptimizationResult where IM: InverseMaintener::Column as Column>::F> + + im_ops::Cost> + im_ops::Rhs + im_ops::Column + >, - for<'r> IM::F: im_ops::Cost>, { let basis_indices = self.pivot_element_indices(); // Sorting of identity matrix columns diff --git a/src/algorithm/two_phase/phase_two.rs b/src/algorithm/two_phase/phase_two.rs index c96b1824..7436c4a0 100644 --- a/src/algorithm/two_phase/phase_two.rs +++ b/src/algorithm/two_phase/phase_two.rs @@ -19,12 +19,15 @@ use crate::algorithm::two_phase::tableau::kind::non_artificial::NonArtificial; /// /// An `OptimizationResult` indicating whether or not the problem has a finite optimum. It cannot be /// infeasible, as a feasible solution is needed to start using this method. -pub fn primal( - tableau: &mut Tableau>, +pub fn primal<'provider, IM, MP, PR>( + tableau: &mut Tableau>, ) -> OptimizationResult where - IM: InverseMaintener::F>>, - for<'r> IM::F: im_ops::Cost>, + IM: InverseMaintener::F> + + im_ops::Cost> + + >, MP: MatrixProvider, PR: PivotRule, { diff --git a/src/data/linear_algebra/vector/sparse.rs b/src/data/linear_algebra/vector/sparse.rs index 924873ac..867c751c 100644 --- a/src/data/linear_algebra/vector/sparse.rs +++ b/src/data/linear_algebra/vector/sparse.rs @@ -203,7 +203,7 @@ where C: SparseComparator, { type F = F; - type Iter<'a> = SparseSliceIterator<'a, F>; + type Iter<'a> where C: 'a = SparseSliceIterator<'a, F>; fn iter(&self) -> Self::Iter<'_> { SparseSliceIterator::new(&self.data) diff --git a/src/tests/problem_1.rs b/src/tests/problem_1.rs index a9bb9b30..0f2571fe 100644 --- a/src/tests/problem_1.rs +++ b/src/tests/problem_1.rs @@ -402,11 +402,11 @@ pub fn artificial_tableau_form, Rhs= ) } -pub fn tableau_form>>( - provider: &MP, +pub fn tableau_form<'provider, MP: MatrixProvider>>( + provider: &'provider MP, ) -> Tableau>, NonArtificial> where - for<'a> S: im_ops::Cost>, + S: im_ops::Cost>, { let carry = { let minus_objective = RB!(-58);