multiscape 1.2.1
Spatial relations
-
add_spatial_relations()now supportsallow_self = TRUEtogether withdirected = TRUE. Diagonal entries(i, i)in directed relations are interpreted as unary planning-unit terms rather than as directed self-dependencies. - Fragmentation objectives for planning units and actions now handle diagonal terms consistently for both directed and undirected spatial relations.
multiscape 1.2.0
Objective and decision-space analysis
- Added
frontier_neighbors(),linkage_distances(),linkage_transition(),linkage_turnover(), andlinkage_contrasts()for objective–decision linkage analysis. - Added
get_solution_states()andselection_consistency()for summarizing spatial decisions across solutions. - Standardized public solution identifiers as positive integers.
Solver configuration
- Added solver-specific validation of unsupported parameters, which are now reported and ignored before solving.
- Disabled automatic solver logs and explicit thread limits by default.
- Fixed CPLEX thread handling, Gurobi log-file naming, CBC solution limits, and preservation of
gap_limitprecision.
Spatial fragmentation
- Preserved directed spatial relations during model construction.
- Fragmentation objectives now distinguish directed arcs from undirected edges and reject duplicated relations.
Documentation
- Reorganized the package reference and workflow around Problem and SolutionSet, with dedicated objective-space (frontier_()), decision-space (selection_()), and linkage (linkage_*()) function families.
- Updated examples and documentation to use the common simulated multi-action problem across the new analysis functions.
multiscape 1.1.3
Documentation and examples
- Replaced the extended README case study with a concise, spatially structured example of multi-objective, multi-action planning.
- Added
load_sim_multiaction()and its associated simulated planning units, features, action costs, and action-specific effects for examples, tests, and introductory documentation. - Added a detailed vignette on multi-objective forest-restoration planning in a highly productive landscape with an existing conservation network.
- Formulated restoration cost and four ecosystem-service opportunity-cost objectives specifically for the
restorationaction, while retaining fixed conservation commitments as spatial context. - Demonstrated an a posteriori AUGMECON workflow with 81 threshold configurations, non-dominance filtering, removal of repeated decision vectors, objective extremes, closest-to-ideal compromise selection, and decision-space comparisons.
- Added a compressed, precomputed
SolutionSetto support reproducible vignette and pkgdown builds without requiring Gurobi or rerunning the full optimization. - Added visual summaries for additional cost versus ecosystem-service opportunity cost, normalized objective performance, joint ecosystem-service regret, representative spatial allocations, and Jaccard similarity among efficient plans.
- Linked objective-space and map diagnostics through consistent solution identifiers and colours for the least-cost plan, the five-objective compromise, and service-specific extremes.
multiscape 1.1.2
- Relaxed model validation so feature targets are no longer mandatory when another substantive constraint or locked-in decision defines a non-empty planning problem.
- Added an informative warning for minimum-cost problems that have no feature targets, positive area requirement, or locked-in decisions, instead of stopping model construction unconditionally.
Result tables and maintenance
- Standardized user-facing result tables so
solution_idis shown as the first column. - Removed
run_idfrom user-facing solution extractors and frontier outputs; it is now kept forget_runs()and internal matching only. - Removed internal columns such as
internal_idfrom planning-unit outputs. - Fixed
get_targets()so it consistently returnssolution_idinstead ofrun_id. - Updated
frontier_extremes()andfrontier_distances()to follow the samesolution_id-based output convention. - Added an example for
get_runs(). - Fixed Rd warnings from missing cross-references and undocumented deprecated arguments.
multiscape 1.1.1
User-facing API
Renamed planning-unit functions and arguments to use
planning_unitsconsistently instead ofpu.-
Deprecated older function aliases kept for backwards compatibility:
-
get_pu()in favour ofget_planning_units(); -
plot_spatial_pu()in favour ofplot_spatial_planning_units(); -
add_constraint_locked_pu()in favour of the planning-unit naming convention; -
add_objective_min_fragmentation_pu()in favour ofadd_objective_min_fragmentation_planning_units().
-
-
Deprecated older multi-objective run helpers:
-
run_grid()in favour ofset_runs_grid(); -
run_manual()in favour ofset_runs_manual(); -
mo_control()in favour ofset_runs_control().
-
Solution and result extractors
- Simplified public result tables to use
solution_idas the main identifier for stored solutions. - Kept
run_idprimarily forget_runs()and internal diagnostics, reducing ambiguity in user-facing summary outputs. - Updated
get_objectives()to return cleaner user-facing tables while preserving run-level identifiers internally for frontier and dominance calculations. - Updated getters, plotting functions, and error messages to use
solution/solutionsterminology consistently.
Multi-objective methods
- Updated weighted-sum defaults so that automatic grids are normalized by default, while manual weight designs use the supplied weights exactly.
- Allowed manual weighted-sum weights to be non-negative and have any positive row total when
normalize_weights = FALSE. - Improved validation of manual weighted-sum designs and multi-objective control objects.
- Removed outdated internal
feasible_onlyhandling from objective extraction workflows.
multiscape 1.1.0
Solution architecture
- Simplified the public result architecture so that
solve()consistently returns aSolutionSet, including for single-objective problems. - Removed the internal
Solutionclass from the public API and documentation. Individual run-level solutions remain available only as internal components of aSolutionSet. - Added stable
solution_ididentifiers to distinguish stored solutions from attempted runs identified byrun_id. - Updated run, solution, and summary tables to preserve
run_idandsolution_idconsistently across extraction and analysis functions. - Improved internal finalization of solution metadata and identifiers after solving.
- Updated
SolutionSetprinting and documentation to reflect the distinction between run attempts and stored solutions.
Base conservation-planning workflow
- Added automatic support for base conservation-planning problems when no explicit actions or effects are supplied.
- Problems without explicit actions are now interpreted as binary conservation decisions, where each planning unit can be conserved or not conserved.
- Added an implicit conservation action and internally generated feature contributions based on the feature amounts stored in
dist_features. - The implicit conservation model uses
amount_afterto represent the feature amount obtained when a planning unit is conserved.
Multi-objective run design and controls
- Revised the multi-objective run-design resolver used by weighted-sum, epsilon-constraint, and AUGMECON methods.
- Improved support for automatic and manually specified run designs through
run_grid()andrun_manual(). - Added and documented common multi-objective execution controls through
mo_control(). - Improved handling of infeasible runs, missing solutions, solver errors, and slack upper bounds.
- Standardized the storage of run-design parameters and objective values in the
SolutionSetrun table. - Preserved infeasible runs in the run history while assigning
solution_idonly to runs that produced a stored solution. - Improved objective evaluation and model preparation across multi-objective methods.
- Fixed weighted-sum objective preparation for implicit conservation benefit objectives.
- Improved validation of objective coefficient vectors and objective-specific error messages.
Result extraction
- Added
get_runs()to extract run-level status, runtime, gap, design parameters, solution identifiers, and objective values. - Added
get_objectives()to extract objective values in long or wide format. - Added
get_objective_specs()to extract registered objective aliases, objective types, model types, optimization senses, and creation metadata. - Updated objective extraction to include both
run_idandsolution_id. - Updated existing extraction functions to work consistently with the unified
SolutionSetarchitecture. - Improved handling of infeasible runs and missing objective values during extraction.
Solution-set management
- Added
solution_filter()to return a coherently filteredSolutionSet. -
solution_filter()can filter byrun_id,solution_id, solver status, or feasibility. - Added optional filtering of non-dominated solutions using
moocore. - Added support for selecting the objectives used to evaluate dominance.
- Ensured that filtering updates run tables, design tables, stored solutions, and summary tables consistently.
- Added cloning of
SolutionSetobjects before modification to prevent reference-based mutation of the original object. - Added
solution_append()to combine compatibleSolutionSetobjects generated from the same planning problem. -
solution_append()verifies compatibility of planning units, features, actions, effects, targets, constraints, locks, spatial relations, and objective definitions. - Appended runs and solutions are automatically assigned unique
run_idandsolution_idvalues. - Added support for combining solution sets obtained from different multi-objective methods or run designs applied to the same planning problem.
- Added
solution_unique()to retain one representative from groups of equivalent solutions. -
solution_unique()can identify repeated solutions using either complete decision vectors or objective values. - Added numerical tolerance controls for identifying equivalent points in objective space.
- Preserved runs without stored solutions when removing duplicated solutions.
Frontier analysis
- Added
frontier_extremes()to identify the observed minimum and maximum values of each objective. - Added classification of observed bounds as
bestorworstaccording to each objective’s optimization sense. - Added support for returning all tied extreme solutions or only the first representative.
- Added
frontier_distances()to calculate normalized distances to observed ideal and nadir points. - Added automatic transformation of maximization objectives into a common minimization space for frontier calculations.
- Added range normalization so that objectives measured in different units contribute comparably to distance calculations.
- Added Euclidean, Manhattan, and Chebyshev distance metrics.
- Added rankings based on proximity to the observed ideal point and distance from the observed nadir point.
- Added original-scale ideal, nadir, and objective-range metadata to the returned distance tables.
- Clarified that frontier reference points are calculated from the solutions contained in the supplied
SolutionSet.
Selection analysis
- Added
selection_frequency()to calculate how frequently each planning-unit/action assignment is selected across stored solutions. - Standardized selection analysis around a canonical planning-unit/action representation.
- Simple conservation-planning problems are represented using the implicit
conservationaction. - Added
selection_similarity()to quantify structural similarity among solutions. - Added Jaccard similarity for comparing selected planning-unit/action assignments.
- Added Hamming similarity for comparing complete binary assignment vectors, including shared non-selections.
- Added long-format and matrix-format similarity outputs.
- Added internal helpers to construct consistent long-format and matrix-format selection representations.
Documentation and website
- Reorganized the pkgdown reference index into dedicated sections for:
- result extraction;
- solution-set management;
- frontier analysis;
- selection analysis;
- multi-objective workflow configuration.
- Removed public documentation references to the internal
Solutionclass. - Updated function documentation to use the unified
SolutionSetterminology. - Updated examples and cross-references for
run_id,solution_id, objective extraction, filtering, frontier analysis, and selection analysis. - Added
moocoreas an optional dependency for non-dominance filtering. - Updated GitHub Actions configurations for current Codecov and Node.js runner requirements.
- Updated Codecov uploads to use the PyPI CLI and avoid binary signature-verification failures.
- Updated GitHub Actions versions for Node.js 24 compatibility.
multiscape 1.0.7
CRAN release: 2026-04-30
- Updated native routine registration to resolve additional CRAN LTO/gcc-ASAN checks.
- Revised examples and package metadata for CRAN compliance.
multiscape 1.0.6
CRAN release: 2026-04-28
- Fix CRAN submission issues
- Revise examples and DESCRIPTION for CRAN resubmission
multiscape 1.0.4
- First CRAN release of
multiscape. - Provides a modular workflow for exact multi-objective spatial planning based on mixed-integer programming (MIP).
- Introduces the core
Problem,Solution, andSolutionSetclasses. The public result architecture was later unified aroundSolutionSetin version 1.1.0. - Adds support for modular problem construction through
create_problem(),add_*(),set_*(), andsolve(). - Supports atomic objective registration and multi-objective solution methods, including weighted-sum, epsilon-constraint, and AUGMECON.
- Includes support for spatial relations such as boundary, rook, queen, k-nearest neighbours, and distance-based relations.
- Supports commercial and open-source solvers, including Gurobi, CPLEX, CBC, and SYMPHONY.
- Adds user-facing extraction and visualization tools for planning units, actions, features, targets, spatial outputs, and trade-offs.
- Includes substantial updates to documentation, package structure, and contribution guidelines.
