library(sp)
, library(sf)
,
library(sp)
and/or library(raster)
(as
needed).add_cbc_solver()
to throw a
segfault when solving a problem wherein the rij_matrix(x)
has a zero amount for the last feature in the last planning unit
(#247).simulate_data()
, simulate_cost()
and simulate_species()
functions to improve performance
using the fields package.boundary_matrix()
to use STR query trees by
default.boundary_matrix()
to use the
geos package (#218).simulate_cost()
and
simulate_species()
so that they no longer depend on the
RandomFields package.presolve_check()
function to (i) reduce
chances of it incorrectly throwing an error when the input data won’t
actually cause any issues, and (ii) provide recommendations for
addressing issues.add_min_largest_shortfall_objective()
so that examples
complete in a shorter period of time.x
that are
numeric
or matrix
format, (ii) x
that contain missing (NA
) values, and (iii)
rij_matrix
that are in dgCMatrix
format. This
bug only occurred when all three of these specific conditions were met.
When it occurred, the bug caused planning units with NA
cost values to receive very high cost values (e.g., 1e+300). This bug
meant that when attempting to solve the problem, the presolve checks
(per presolve_check()
) would throw an error complaining
about very high cost values (#236).add_locked_in_constraints()
and
add_locked_out_constraints()
to ensure that a meaningful
error message is provided when no planing units are locked (#234).presolve_check()
so that it does not throw a
meaningless warning when the mathematical objective function only
contains zeros.presolve_check()
to help reduce chances of
mis-attributing high connectivity/boundary values due to planning unit
costs.add_connectivity_penalties()
function and
documentation so that it is designed specifically for symmetric
connectivity data.add_asym_connectivity_penalties()
function that is
designed specifically for asymmetric connectivity data. This function
has been created to help ensure that asymmetric connectivity data are
handled correctly. For instance, using asymmetric connectivity data with
add_connectivity_penalties()
function in previous versions
of the package sometimes resulted in the data being incorrectly treated
as symmetric data. Additionally, this function uses an updated
mathematical formulation for handling asymmetric connectivity so that it
provides similar results to the Marxan software (#323).marxan_problem()
function so that it can be used
with asymmetric connectivity data. This is now possible because there
are dedicated functions for symmetric and asymmetric connectivity.zones
parameter of the
add_connectivity_penalties()
function.eval_ferrier_importance()
(#220). Although this function is now recommended for general use, the
documentation contained an outdated warning and so the warning has now
been removed.eval_n_summary()
function now
returns a table with the column name "n"
(instead of
"cost"
) for the number of selected planning units
(#219).marxan_problem()
for importing Marxan data
files.sim_pu_sf
and
sim_pu_zones_sf
data given class updates to the sf
package (compatible with version 1.0.3+).write_problem()
function.eval_ferrier_importance()
function with verified
code.presolve_check()
function to throw warning when
really high values specified in
add_neighbor_constraints()
.Update add_cbc_solver()
function so that it can use a
starting solution to reduce run time (via the
start_solution
parameter).
add_linear_constraint()
function to add arbitrary
constraints.add_min_shortfall_objective()
and
add_min_largest_shortfall_objective()
functions to handle
targets with a target threshold value of zero.eval_connectivity_summary()
function, and tweaking the
header in the README.problem()
function.add_gurobi_solver()
function so that it doesn’t
print excess debugging information (accidentally introduced in previous
version 7.0.1.1).add_gurobi_solver()
function to support the
node_file_start
parameter for the Gurobi software. This
functionality is useful solving large problems on systems with limited
memory (#139).write_problem()
function to save the mixed integer
programming representation of a conservation planning problem to a file.
This function is useful for manually executing optimization
solvers.rij_matrix()
function documentation
(#189).add_gurobi_solver()
function to allow
specification of a starting solution (#187). This functionality is
useful for conducting a boundary penalty parameter calibration exercise.
Specifically, users can specify the starting solution for a given
penalty value based on the solution obtained using a smaller penalty
value.solve
now assigns layer names based on zone
names for solutions in format.time_limit
and verbose
parameters
for add_cbc_solver()
now work as expected.add_gurobi_solver()
function to report timings
following the same methods as the other solvers.add_lpsymphony_solver()
function to be more
memory efficient (#183).add_cbc_solver()
is now preferred over all
other open source solvers.add_cbc_solver()
would sometimes return
incorrect solutions to problems with equality constraints.add_cbc_solver()
function to generate solutions
using the open source CBC solver via the rcbc R package
(https://github.com/dirkschumacher/rcbc).add_rsymphony_solver()
and
add_lpsymphony_solver()
functions to have a default
time_limit
argument set as the maximum machine integer for
consistency.add_rsymphony_solver()
,
add_lpsymphony_solver()
, and
add_gurobi_solver()
functions to require
logical
(TRUE
/FALSE
) arguments
for the first_feasible
parameter.add_default_solver()
function so that it prefers
add_lpsymphony_solver()
over
add_rsymphony_solver()
, and add_cbc_solver()
over all open source solvers.gap
parameter for the add_rsymphony_solver()
and add_lpsymphony_solver()
corresponded to the maximum
absolute difference from the optimal objective value. This was an error
due to misunderstanding the SYMPHONY documentation. Under
previous versions of the package, the gap
parameter
actually corresponded to a relative optimality gap expressed as a
percentage (such thatgap = 10
indicates that solutions must
be at least 10% from optimality). We have now fixed this error and the
documentation described for the gap
parameter is correct.
We apologize for any inconvenience this may have caused.eval_
) to
mention that the argument to solution
should only contain
columns that correspond to the solution (#176).sf
data to documentation for
importance evaluation functions (#176).solution
arguments are supplied to the evaluation functions (#176).sf
planning unit data.add_manual_targets()
documentation.add_min_largest_shortfall()
objective
function.eval_cost()
function to calculate the cost of a
solution.eval_boundary()
function to calculate the exposed
boundary length associated with a solution.eval_connectivity()
function to calculate the
connectivity associated with a solution.feature_representation()
function. It is now
superseded by the eval_feature_representation()
function.eval_feature_representation()
function to assess
how well each feature is represented by a solution. This function is
similar to the deprecated eval_feature_representation()
function, except that it follows conventions for other evaluation
functions (e.g. eval_cost
).eval_target_representation()
function to assess how
well each target is met by a solution. This function is similar to the
eval_feature_representation()
, except that it corresponds
to the targets in a conservation planning problem.ferrier_score
function as
eval_ferrier_importance()
function for consistency.replacement_cost
function as
eval_replacement_importance()
function for
consistency.rarity_weighted_richness
function as
eval_rare_richness_importance()
function for
consistency.add_locked_out_constraints()
function to enable a
single planning unit from being locked out of multiple zones (when data
are specified in raster format).problem()
function to reduce memory consumption
for sparse matrix arguments (#164).add_cplex_solver()
function to generate solutions
using IBM
CPLEX (via the cplexAPI package).add_gap_portfolio()
documentation to note that
it only works for problems with binary decisions (#159).add_loglinear_targets()
and
loglinear_interpolation()
functions. Previously they used a
natural logarithm for log-linear interpolation. To follow target setting
approaches outlined by Rodrigues et al. (2004), they now use the decadic
logarithm (i.e. log10()
).ferrier_score()
function. It
no longer incorrectly states that these scores can be calculated using
CLUZ and now states that this functionality is experimental until the
formulation can be double checked.--run-donttest
).feature_representation()
bug incorrectly throwing
error with vector planning unit data (e.g. sf-class data).rij_matrix()
to throw an error for
large raster data (#151).add_linear_penalties()
to add penalties that
penalize planning units according to a linear metric.connectivity_matrix()
documentation to provide
an example of how to generate connectivity matrices that account for
functional connectivity.solve()
function.solve()
function
to the Salt Spring Island and Tasmania vignettes.compile()
to throw warning when compiling
problems that include feature weights and an objective function that
does not use feature weights.add_gurobi_solver()
function to provide more
options for controlling the pre-solve step when solving a problem.ferrier_score()
function to compute
irreplaceability scores following Ferrier et al (2000).proximity_matrix()
function to generate matrices
indicating which planning units are within a certain distance of each
other (#6).connected_matrix()
function to
adjacency_matrix()
function to follow the naming
conventions of other spatial association functions (#6).add_extra_portfolio()
,
add_top_portfolio()
, add_gap_portfolio()
functions to provide specific options for generating portfolios
(#134).intersecting_units
and
fast_extract
functions to use the exactextractr
and fasterize packages to speed up raster data extraction
(#130).boundary_matrix()
function when handling
SpatialPolygon
planning unit data that contain multiple
polygons (e.g. a single planning unit contains to two separate islands)
(#132).set_number_of_threads()
,
get_number_of_threads()
, and is.parallel()
functions since they are no longer used with new data extraction
methods.add_pool_portfolio()
function because the new
add_extra_portfolio()
and add_top_portfolio()
functions provide this functionality (#134).add_rsymphony_solve()r
and
add_lpsymphony_solver()
throwing an an infeasible error
message for feasible problems containing continuous or semi-continuous
variables.presolve_check()
function more
informative (#124).rij_matrix()
so that amounts are calculated
correctly for vector-based planning unit data.fast_extract()
.add_locked_in_constraints()
and
add_locked_out_constraints()
functions so that they no
longer throw an unnecessary warning when when they are added to
multi-zone problems using raster data with NA
values.add_locked_in_constraints()
and add_locked_out_constraints()
functions to provide
recommended practices for raster data.rarity_weighted_richness()
returning
incorrect scores when the feature data contains one feature that has
zeros amounts in all planning units (e.g. the tas_features
object in the prioritizrdata R package; #120).add_gurobi_solver()
returning solution
statuses that are slightly larger than one (e.g. 1+1.0e-10) when solving
problems with proportion-type decisions (#118).replacement_cost()
function to use parallel
processing to speed up calculations (#119).add_manual_bounded_constraints()
function to apply
lower and upper bounds on planning units statuses in a solution
(#118).add_gurobi_solver()
,
add_lpsymphony_solver()
, and
add_rsymphony_solver()
functions so that they will not
return solutions with values less than zero or greater than one when
solving problems with proportion-type decisions. This issue is the
result of inconsistent precision when performing floating point
arithmetic (#117).add_locked_in_constraints()
and
add_locked_out_constraints()
functions to provide a more
helpful error message the locked_in
/locked_out
argument refers to a column with data that are not logical (i.e.
TRUE
/FALSE
; #118).solve()
function to throw a more accurate and
helpful error message when no solutions are found (e.g. due to problem
infeasibility or solver time limits).add_max_phylo_objective()
function to
add_max_phylo_div_objective()
.add_max_phylo_end_objective()
function to maximize
the phylogenetic endemism of species adequately represented in a
prioritization (#113).add_max_phylo_end_objective()
,
replacement_cost()
, and
rarity_weighted_richness()
functions to the Prioritizr
vignette.sim_phylogeny
).add_max_phylo_div_objective()
function.irreplaceability
manual entry to document functions
for calculating irreproducibility scores.replacement_cost()
function to calculate
irreproducibility scores for each planning unit in a solution using the
replacement cost method (#26).rarity_weighted_richness()
function to calculate
irreproducibility scores for each planning unit in a solution using
rarity weighted richness scores (#26).add_min_shortfall_objective()
function to find
solutions that minimize target shortfalls.add_min_shortfall_objective()
function to main
vignette.problem()
tests so that they work when no solvers
are installed.feature_representation()
function now requires
missing (NA
) values for planning unit statuses in a
solution for planning units that have missing (NA
) cost
data.presolve_check()
function to investigate potential
sources of numerical instability before trying to solve a problem. The
manual entry for this function discusses common sources of numerical
instability and approaches for fixing them.solve()
function will now use the
presolve_check()
function to verify that problems do not
have obvious sources of numerical instability before trying to solve
them. If a problem is likely to have numerical instability issues then
this function will now throw an error (unless the
solve(x, force = TRUE)
).add_rsymphony_solver()
function now uses sparse
matrix formats so that attempts can be made to solve large problems with
SYMPHONY—though it is unlikely that SYMPHONY will be able to
solve such problems in a feasible period of time.tibble::as.tibble()
instead of
tibble::as_tibble()
.solve()
(#110).add_boundary_penalties()
and add_connectivity_penalties()
function (#106).add_rsymphony_solver()
and
add_lpsymphony_solver()
sometimes returned infeasible
solutions when subjected to a time limit (#105).ConservationProblem-class
objects. These
methods were implemented to be used in future interactive applications
and are not currently used in the package. As a consequence, these bugs
do not affect the correctness of any results.bad error message
error being thrown when input
rasters are not comparable (i.e. same coordinate reference system,
extent, resolutions, and dimensionality) (#104).solve()
printing annoying text about
tbl_df
(#75).add_max_features_objective()
example code.add_neighbor_constraints()
and
add_contiguity_constraints()
functions used more memory
than they actually needed (#102). This is because the argument
validation code converted sparse matrix objects
(i.e. dgCMatrix
) to base objects (i.e. matrix
)
class temporarily. This bug only meant inefficient utilization of
computer resources—it did not affect the correctness of any
results.add_mandatory_allocation_constraints()
function.
This function can be used to ensure that every planning unit is
allocated to a management zone in the solution. It is useful when
developing land-use plans where every single parcel of land must be
assigned to a specific land-use zone.add_mandatory_allocation_constraints()
to the
Management Zones and Prioritizr vignettes.$find(x)
method for
Collection
prototypes that caused it to throw an error
incorrectly. This method was not used in earlier versions of this
package.feature_representation()
function that
caused the “amount_held” column to have NA values instead of the correct
values. This bug only affected problems with multiple zones.category_layer()
function that it this function to
incorrectly throw an error claiming that the input argument to
x
was invalid when it was in fact valid. This bug is
encountered when different layers the argument to x
have
non-NA values in different cells.add_contiguity_constraints()
function now uses
sparse matrix formats internally for single-zone problems. This means
that the constraints can be applied to single-zoned problem with many
more planning units.add_connectivity_penalties()
function now uses
sparse matrix formats internally for single-zone problems. This means
that connectivity penalties can be applied to single-zoned problem with
many more planning units.add_max_utility_objective()
and
add_max_cover_objective()
functions to make it clearer that
they do not use targets (#94).add_locked_in_constraints()
and
add_locked_out_constraints()
that incorrectly threw an
error when using logical
locked data
(i.e. TRUE
/FALSE
) because it incorrectly
thought that valid inputs were invalid.add_locked_in_constraints()
,
add_locked_out_constraints()
, and
add_manual_locked_constraints()
where solving the same
problem object twice resulted in incorrect planning units being locked
in or out of the solution (#92).feature_abundances()
that caused the solve
function to throw an error when attempting to solve problems with a
single feature.add_cuts_portfolio()
that caused the
portfolio to return solutions that were not within the specified
optimality gap when using the Gurobi solver.add_pool_portfolio()
function.feature_representation()
function now allows
numeric
solutions with attributes (e.g. when output by the
solve()
function) when calculating representation
statistics for problems with numeric
planning unit data
(#91).add_manual_targets()
function threw a warning when
some features had targets equal to zero. This resulted in an excessive
amount of warnings. Now, warnings are thrown for targets that are less
then zero.problem()
function sometimes incorrectly threw a
warning that feature data had negative values when the data actually did
not contain negative values. This has now been addressed.problem
function now allows negative values in the
cost and feature data (and throws a warning if such data are
detected).add_absolute_targets()
and
add_manual_targets()
functions now allow negative targets
(but throw a warning if such targets are specified).compile
function throws an error if a problem is
compiled using the expanded formulation with negative feature data.add_absolute_targets()
function now throws an
warning—instead of an error—if the specified targets are greater than
the feature abundances in planning units to accommodate negative values
in feature data.add_max_cover_objective()
in prioritizr
vignette (#90).add_relative_targets()
documentation now makes it
clear that locked out planning units are included in the calculations
for setting targets (#89).add_loglinear_targets()
function now includes a
feature_abundances()
parameter for specifying the total
amount of each feature to use when calculating the targets (#89).feature_abundances()
function to calculate the
total amount of each feature in the planning units (#86).add_cuts_portfolio()
function uses the
Gurobi solution pool to generate unique solutions within a
specified gap of optimality when tasked with solving problems with
Gurobi (version 8.0.0+; #80).add_pool_portfolio()
function to generate a
portfolio of solutions using the Gurobi solution pool
(#77).boundary_matrix()
function now has the experimental
functionality to use GEOS STR trees to speed up processing (#74).feature_representation()
function to how well
features are represented in solutions (#73).solve()
function printing
superfluous text (#75).problem()
function.sim_pu_zones_stack
,
sim_pu_zones_polygons
, and sim_features_zones
for exploring conservation problems with multiple management zones.zones
function and Zones
class to
organize data with multiple zones.problem()
function now accepts Zone
objects as arguments for feature
to create problems with
multiple zones.add_relative_targets()
and
add_absolute_targets()
functions for adding targets to
problems can be used to specify targets for each feature in each
zone.add_manual_targets()
function for creating targets
that pertain to multiple management zones.solve()
function now returns a list
of
solutions when generating a portfolio of solutions.add_locked_in_constraints()
and
add_locked_out_constraints()
functions for specifying which
planning units are locked in or out now accept matrix
arguments for specifying which zones are locked in or out.add_manual_locked_constraints()
function to
manually specify which planning units should or shouldn’t be allocated
to specific zones in solutions.zones
parameter) and specify how
they they should be applied (using the data
parameter. All
of these functions have default arguments that mean that problems with a
single zone should have the same optimal solution as problems created in
the earlier version of the package.add_feature_weights()
function can be used to
weight different the representation of each feature in each zone.binary_stack()
, category_layer()
, and
category_vector()
functions have been provided to help work
with data for multiple management zones.?prioritizr
), and README.marxan_problem()
has been updated with more
comprehensive documentation and to provide more helpful error messages.
For clarity, it will now only work with tabular data in the standard
Marxan format.add_boundary_penalties()
(#62).add_locked_in_constraints()
and
add_locked_out_constraints()
throw an exception when used
with semi-continuous-type decisions (#59).compile()
thrown when the same planning
unit is locked in and locked out now prints the planning unit indices in
a readable format.add_locked_in_constraints()
and
add_locked_out_constraints()
are ignored when using
proportion-type decisions (#58).predefined_optimization_problem()
which
incorrectly recognized some inputs as invalid when they were in fact
valid.R CMD check
related to proto in
Depends.add_lpsymphony_solver()
now throws warnings to alert
users to potentially incorrect solutions (partially addressing
#40).add_*_objectives
now pass when executed
with slow solvers (partially addressing #40).compile()
now works when no solvers are installed
(#41).add_*_solvers
are now unbounded and
can accept values larger than 1 (#44).add_max_cover_objective()
function has been renamed
to the add_max_utility_objective()
, because the formulation
does not follow the historical formulation of the maximum coverage
reserve selection problem (#38).add_max_cover_objective()
function now follows the
historical maximum coverage objective. This fundamentally changes
add_max_cover_objective()
function and breaks compatibility
with previous versions (#38).add_lpsymphony_solver()
examples and tests to
skip on Linux operating systems.add_lpsymphony_solver()
causing error when
attempting to solve problems.numeric
vector data
that caused an error.numeric
vector input
with rij data containing NA values.apply_boundary_penalties()
and
add_connectivity_penalties()
causing the function to throw
an error when the number of boundaries/edges is less than the number of
planning units.boundary_matrix()
calculations (#30).add_max_phylo_objective()
(#24).ScalarParameter
and
ArrayParameter
prototypes to check t that functions for
generating widgets have their dependencies installed.numeric
planning unit data and portfolios
that caused the solve()
to throw an error.Spatial*DataFrame
input to
marxan_problem()
would always use the first column in the
attribute table for the cost data. This bug is serious
so analysis that used Spatial*DataFrame
inputs in
marxan_problem()
should be rerun.problem()
objects.add_cuts_portfolio()
on Travis.add_cuts_portfolio()
and
add_shuffle_portfolio()
tests on CRAN.data.frame
and Spatial*DataFrame
objects are now stored in columns named “solution_*” (e.g. “solution_1”)
to store multiple solutions.verbose
argument to all solvers. This
replaces the verbosity
argument in
add_lpsymphony_solver()
and
add_rsymphony_solver()
.add_lpsymphony_solver()
and
add_rsymphony_solver()
is reduced.ConservationProblem$print()
now only prints the first
three species names and a count of the total number of features. This
update means that ConservationProblem
objects with lots of
features can now safely be printed without polluting the R console.time_limit
.devtools::build_vignettes()
. Earlier versions needed the
vignettes to be compiled using the Makefile to copy files
around to avoid tangled R code causing failures during R CMD CHECK.
Although no longer needed, the vignettes can still be compiled using the
shell command make vigns
if desired.rmarkdown::render("README.Rmd")
or using the shell command
make readme
. Note that the figures for
README.md
can be found in the directory
man/figures
.prshiny
will now only be run if
executed during an interactive R session. Prior to this R CMD CHECK
would hang.marxan_problem()
using input data.frame()
objects.compile()
function.problem.data.frame
that meant that it did
not check for missing values in rij$pu
.add_absolute_targets()
and
add_relative_targets` related to their standardGeneric being incorrectly
definedadd_corridor_targets()
when argument
connectivities
is a list
. The elements in the
list are assumed to be dsCMatrix
objects (aka symmetric
sparse matrices in a compressed format) and are coerced to
dgCMatrix
objects to reduce computational burden. There was
a typo, however, and so the objects were coerced to
dgCmatrix
and not dgCMatrix
. This evidently
was ok in earlier versions of the RcppArmadillo and/or
Matrix packages but not in the most recent versions.parallel::detectCores()
returns
NA
on some systems preventing users from using the Gurobi
solver–even when one thread is specified.structure(NULL, ...)
with
structure(list(), ...)
.new_waiver()
.add_default_decisions()
and
add_default_solver()
to own help fileadd_default_objectives()
and
add_default_targets()
private functionsadd_corridor_constraints()
that fails to
actually add the constraints with argument to connectivity
is a list.make install
command so that it now actually
installs the package.