Releases: arpastrana/jax_fdm
Releases · arpastrana/jax_fdm
Release v0.8.6
Added
- Wrapped two gradient-free optimizers from scipy: Nelder-Mead and Powell. They are available as
jax_fdm.optimizers.NelderMead
andjax_fdm.optimizers.Powell
, respectively. - Linked two evolutionary optimizers from scipy They are available as
jax_fdm.optimizers.DualAnnealing
andjax_fdm.optimizers.DifferentialEvolution
. - Added support for kwargs in
LossPlotter.plot()
. The kwargs control the parameters of the equilibrium model used to plot the loss history. - Added
VertexSupportParameter.index()
. This change might appear redundant, but it was necessary to deal with the method resolution order of the parent classes ofVertexSupportParameter
. - Added
VertexGroupSupportParameter.index()
for similar reasons as the listed above.
Changed
- Changed
datastructure.print_stats()
to report positive and negative forces separately. - Turned off display in
TruncatedNewton
. - Fixed bug in
OptimizationRecorder
. The recorder did not know how to record optimization history without an explictly initialized optimizer. - Deprecated
jax_fdm.optimization.optimizers.scipy
in favor ofjax_fdm.optimization.optimizers.gradient_based
. - Fixed bug. Return early in
NetworkArtist.edge_width()
if the artist edges list is empty. - Fixed bug in
EdgesForceEqualGoal.prediction()
: the normalization mean of compressive edge forces was a negative number. This led to negative normalized variance values, which was plainly incorrect. VertexGroupSupportParameter
inherits fromVertexGroupParameter
instead ofNodeGroupParameter
. This was a bug.
Removed
Release v0.8.5
Added
Changed
Removed
Release v0.8.4
Added
- Added
NetworkSmoothGoal
to smoothen the shape of a network based on the fairness energy of its nodes w.r.t. their immediate neighborhood. - Implemented
Graph.adjacency
to access the connectivity among nodes/vertices to compute new goals. - Added
adjacency_matrix
as numpy-only function to assembleGraph.adjacency
. The function is largely inspired bycompas.matrices.adjacency_matrix
.
Changed
- Now we use
time.perf_counter
instead oftime.time
to measure logic execution time more accurately.
Removed
Release v0.8.3
Added
Goals
- Implemented
EdgeLoadPathGoal
.
Changed
Floating-point arithmetic
- Updated how to enable double floating precision (
float64
) to comply with changes ofjax.config
injax==0.4.25
.
Equilibrium
- Fixed duplicated fixed point iteration in
EquilibriumModel.equilibrium_iterative
. This led to unnecessarily long runtimes. This change also fixes the "mysterious" bug that madejaxopt
implicit differentiation incompatible with sparse matrices.
Visualization
LossPlotter
exposesplot_legend
to choose whether or not to show legend with curve labels.FDNetworkArtist
takes absolute force density values to calculate viz colors in"fd"
mode.- Fixed bug in
FDNetworkViewerArtist
that threw error when inputing a custom list of edges to display. The problem was that the artist could not find the width of all the edges connected to a node becauseedge_width
is only computed for the custom list of edges. The artist was expecting a dictionary with all the edge widths. - Package
compas-notebook
became an optional dependency because it does not supportcompas<2.0
anymore.
Removed
Release v0.8.1
Added
Losses
- Implemented
LogMaxError
. The goal of this error function is to work as a barrier soft constraint for target maximum values. One good use example would be to restrict the height of a shell to a maximum height.
Changed
Removed
Release v0.8.0
Added
Models
- Added support for efficient reverse-mode AD of the calculation of equilibrium states in the presence of shape-dependent loads, via implicit differentiation. Forward-mode AD is pending.
- Added
EquilibriumModel.equilibrium_iterative
to compute equilibrium states that have shape-dependent edge and face loads using fixed point iteration. - Added
EquiibriumModel.edges_load
andEquiibriumModel.faces_load
to allow computation of edge and face loads. - Implemented
EquilibriumModelSparse.stiffness_matrix
. - Implemented
EquilibriumModel.stiffness_matrix
. - Implemented
EquilibriumModel.force_matrix
. - Implemented
EquilibriumModel.force_fixed_matrix
. - Added
linearsolve_fn
,itersolve_fn
,implicit_diff
, andverbose
as attributes ofEquilibriumModel
. - Added
Equilibrium.load_nodes_iter
as attribute to include the node loads inLoadState.nodes
when runningEquilibriumModel.equilibrium_iterative()
. Defaults toFalse
.
Equilibrium
- Restored
vectors
field inEquilibriumState
. - Implemented
equilibrium.states.LoadState
. - Implemented
equilibrium.states.EquilibriumParametersState
.
Solvers
- Implemented
solver_anderson
, to find fixed points of a function withjaxopt.AndersonAcceleration
. The implicit differentiation operator of the solver provided byjaxopt
is deactivated when usingEquilibriumModelSparse
becausejaxopt
does not support sparse matrices yet. - Defined a
jax.custom_vjp
forfixed_point
, an interface function that solves for fixed points of a function for different root-finding solver types:solver_fixedpoint
,solver_forward
, andsolver_newton
. - Implemented
solver_fixedpoint
, a function that wrapsjaxopt.FixedPointIterator
to calculate static equilibrium iteratively. - Implemented
solver_forward
, to find fixed points of a function using anequinox.while_loop
. - Implemented
solver_netwon
, to find fixed points of a function using Newton's method.
Loads
- Added
equilibrium.loads
module to enable support for edge and face-loads, which correspond to line and area loads, respectively.
These two load types can be optionally become follower loads setting theis_local
input flag toTrue
. A follower load will update its direction iteratively, according to the local coordinate system of an edge or a face at an iteration. The two main functions that enable this feature areloads.nodes_load_from_faces
andloads.nodes_load_from_edges
. These functions are wrapped byEquilibriumModel
underEquiibriumModel.edges_load
andEquiibriumModel.faces_load
. - Implemented
equilibrium.loads.nodes_
.
Datastructures
- Report standard deviation in
FDDatastructure.print_stats()
. - Added constructor method
FDNetwork.from_mesh
. - Added
FDMesh.face_lcs
to calculate the local coordinaty system of a mesh face. - Added
datastructures.FDDatastructure.edges_loads
. - Added
datastructures.FDMesh
. - Added
datastructures.Datastructure
. - Implemented
structures.EquilibriumStructureMeshSparse
. - Implemented
structures.EquilibriumStructureMesh
. - Implemented
structures.Mesh
. - Implemented
structures.MeshSparse
. - Implemented
structures.Graph
. - Implemented
structures.GraphSparse
. - Added
FDNetwork.is_edge_fully_supported
. - Added
EquilibriumMeshStructure.from_mesh
with support for inhomogenous faces (i.e. faces with different number of vertices). The solution is to pad the rows of thefaces
2D array with-1
to matchmax_num_vertices
.
Goals
- Implemented
NetworkXYZLaplacianGoal
. - Implemented base class
MeshGoal
. - Implemented
MeshXYZLaplacianGoal
. - Implemented
MeshXYZFaceLaplacianGoal
. - Implemented
MeshAreaGoal
. - Implemented
MeshFacesAreaEqualizeGoal
.
Optimization
- Added
optimization.Optimizer.loads_static
attribute to store edge and face loads during optimization.
Geometry
- Added
polygon_lcs
to compute the local coordinate system of a closed polygon. - Added
line_lcs
to compute the local coordinate system of a line. - Added
nan
gradient guardrail tonormalize_vector
calculations.
Parameters
- Added support for mesh vertex parameters.
Numerical
- Added explicit array integer types in
__init__
:DTYPE_INT_NP
andDTYPE_INT_JAX
Sparse solver
- Set
spsolve_gpu_ravel
as the default sparse solver on GPUs (spsolve_gpu
). - Added
spsolve_gpu_ravel
to solve the FDM linear system all at once on GPUs. - Implemented helper function
sparse_blockdiag_matrix
tospsolve_gpu_ravel
.
Visualization
- Added
plotters/VectorArtist
to custom plot loads and reactions arrows. - Implemented
LossPlotter._print_error_stats
to report loss breakdown of error terms.
Changed
Models
Equilibrium
- The functions
fdm
andconstrained_fdm
take iterative equilibrium parameters as function arguments. - The functions
fdm
andconstrained_fdm
can take anFDMesh
as input, in addition toFDNetwork
.
Sparse solver
- Decoupled
sparse_solver
from any force density calculations. Now, it is a simpler solver that only takes as inputs the LHS matrixA
and the RHS matrixb
, and thus, it could be used to potentially solve any sparse linear system of equations. Its signature now is analogous to that ofjax.numpy.linalg.solve
. - Condensed signature of sparse linear solver
sparse_solve
to take a structureEquilibriumStructure
as input, instead of explicit attributes of a structure. - Changed signature of
sparse_solve_bwd
to take two arguments, where the first is the "residual" values produced on the forward pass byfwd
, and the second is the output cotangent with the same structure as the primal function output (sparse_solve
). - Condensed signature of helper functions
sparse_solve_fwd
to take matricesA
andb
as inputs, instead of explicit attributes of the FDM and of aEquilibriumStructure
. - Renamed previous verison of
spsolve_gpu
tospsolve_gpu_stack
.
Geometry
- Added support for
jnp.nan
inputs in the calculations ofgeometry.normal_polygon
.
Losses
- Changed signature of
Regularizer.__call__
to take in parameters instead of equilibirum state.
Datastructures
- Overhauled
EquilibriumStructure
andEquilibriumStructureSparse
. They are subclassesequinox.Module
, and now they are meant to be immutable. They also have little idea of what anFDNetwork
is. - Modified
face_matrix
adjacency matrix creation function to skip -1 vertices. This is to add support forMeshStructures
that have faces with different number of vertices.
Optimization
- Use
jax.value_and_grad(loss_fn(x))
instead of usingloss_fn(x)
andjax.grad(loss_fn(x))
separately. This results in optimization speedup because we get both value and grad with a single VJP call. Optimizer.problem
takes anFDNetwork
as input.Optimizer.problem
takes booleanjit_fn
as arg to disable jitting if needed.- Changed
ParameterManager
to require anFDNetwork
as argument at initialization. - Changed
Parameter.value
signature. Gets value fromnetwork
directly, not fromstructure.network
optimization.OptimizationRecorder
has support to store, export and import named tuple parameters.
Visualization
- Fixed bug in
viewers/network_artist.py
that overshifted load arrows. - Edge coloring considers force sign for
force
color scheme inartists/network_artist.py
. - Fixed bug with the coloring of reaction forces in
viewers/network_artist.py
. - Fixed bug with the coloring of reaction forces in
artists/network_artist.py
. LossPlotter
has support to plot named tuple parameters.
Removed
- Removed
EquilibriumModel.from_network
. - Removed
sparse.force_densities_to_A
. Superseded byEquilibriumModelSparse.stiffness_matrix
. - Removed
sparse.force_densities_to_b
. Superseded byEquilibriumModel.force_matrix
. - Removed partial jitting from
Loss.__call__
. - Removed partial jitting from
Error.__call__
.
Release v0.7.1
Added
Changed
- Fixed signature bug in constraint initialization in
ConstrainedOptimizer.constraints
Removed
- Removed implicit
partial(jit)
decorator onConstrainedOptimizer.constraint
. Jitting now takes place explicitly inConstrainedOptimizer.constraints
.
Release v0.7.0
Added
- Added
EquilibriumStructure.init
as a quick fix to warm start properties.
Changed
- Changed signature of equilibrium model to be
EquilibriumModel(params, structure)
. - The
init
function in goals, constraints and parameter takes(model, structure)
as arguments. - Removed
connectivity
related operations fromEquilibriumModel
and inserted them intoEquilibriumStructure
. - Fixed bug in
EquilibriumStructure.nodes
that led to a recursive timeout error. - Renamed example file
butt.py
tovault.py
/ - Renamed file
optimizers.py
toscipy.py
injax_fdm.optimization
.
Removed
- Removed
structure
attribute fromEquilibriumModel
en route to equinox modules.
Release v0.6.0
Added
- Added support for differentiable CPU and GPU sparse solvers to compute the XYZ coordinates of the free nodes with FDM. The solver is custom made and registered via a
jax.custom_vjp
. The forward and backward passes of the sparse solver were made possible thanks to the contributions of @denizokt. This solver lives inequilibrium.sparse.py
. - Added
spsolve_gpu
andspsolve_cpu
. The sparse solver backend is different (the former uses CUDA and the latter scipy) and it gets selected automatically based on what the value ofjax.default_device
is at runtime with functionregister_sparse_solver
. - Implemented
EquilibriumStructureSparse
. - Division of responsabilities: created a
EquilibriumModelSparse
that solves for static equilibrium using anEquilibriumStructureSparse
and the sparse solver.EquilibriumModel
implements the dense linear solver.
Changed
LossPlotter
instantiates a denseEquilibriumModel
.
Removed
Release v0.5.2
Added
Changed
Removed
- Removed
DTYPE
fromcombine_parameters
signature injax_fdm.parameters
due to clashes with JAX versions on windows.