LoopStructural 1.6.23__tar.gz → 1.6.24__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_discrete_interpolator.py +39 -4
  2. loopstructural-1.6.24/LoopStructural/modelling/features/builders/_fault_builder.py +731 -0
  3. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/builders/_geological_feature_builder.py +1 -1
  4. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/maths.py +9 -0
  5. loopstructural-1.6.24/LoopStructural/version.py +1 -0
  6. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural.egg-info/PKG-INFO +1 -1
  7. {loopstructural-1.6.23 → loopstructural-1.6.24}/PKG-INFO +1 -1
  8. loopstructural-1.6.23/LoopStructural/modelling/features/builders/_fault_builder.py +0 -585
  9. loopstructural-1.6.23/LoopStructural/version.py +0 -1
  10. {loopstructural-1.6.23 → loopstructural-1.6.24}/LICENSE +0 -0
  11. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/__init__.py +0 -0
  12. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/__init__.py +0 -0
  13. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/_base.py +0 -0
  14. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/_example_models.py +0 -0
  15. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/claudius.csv +0 -0
  16. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/claudiusbb.txt +0 -0
  17. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/duplex.csv +0 -0
  18. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/duplexbb.txt +0 -0
  19. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/fault_trace/fault_trace.cpg +0 -0
  20. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/fault_trace/fault_trace.dbf +0 -0
  21. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/fault_trace/fault_trace.prj +0 -0
  22. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/fault_trace/fault_trace.shp +0 -0
  23. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/fault_trace/fault_trace.shx +0 -0
  24. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/bbox.csv +0 -0
  25. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/contacts.csv +0 -0
  26. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/fault_displacement.csv +0 -0
  27. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/fault_edges.txt +0 -0
  28. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/fault_locations.csv +0 -0
  29. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/fault_orientations.csv +0 -0
  30. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/stratigraphic_order.csv +0 -0
  31. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/stratigraphic_orientations.csv +0 -0
  32. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/geological_map_data/stratigraphic_thickness.csv +0 -0
  33. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/intrusion.csv +0 -0
  34. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/intrusionbb.txt +0 -0
  35. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/onefoldbb.txt +0 -0
  36. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/onefolddata.csv +0 -0
  37. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/refolded_bb.txt +0 -0
  38. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/refolded_fold.csv +0 -0
  39. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datasets/data/tabular_intrusion.csv +0 -0
  40. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datatypes/__init__.py +0 -0
  41. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datatypes/_bounding_box.py +0 -0
  42. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datatypes/_point.py +0 -0
  43. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datatypes/_structured_grid.py +0 -0
  44. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/datatypes/_surface.py +0 -0
  45. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/export/exporters.py +0 -0
  46. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/export/file_formats.py +0 -0
  47. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/export/geoh5.py +0 -0
  48. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/export/gocad.py +0 -0
  49. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/export/omf_wrapper.py +0 -0
  50. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/__init__.py +0 -0
  51. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_api.py +0 -0
  52. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_builders.py +0 -0
  53. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_constant_norm.py +0 -0
  54. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_cython/__init__.py +0 -0
  55. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_discrete_fold_interpolator.py +0 -0
  56. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_finite_difference_interpolator.py +0 -0
  57. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_geological_interpolator.py +0 -0
  58. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_interpolator_builder.py +0 -0
  59. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_interpolator_factory.py +0 -0
  60. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_interpolatortype.py +0 -0
  61. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_operator.py +0 -0
  62. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_p1interpolator.py +0 -0
  63. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_p2interpolator.py +0 -0
  64. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/_surfe_wrapper.py +0 -0
  65. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_2d_base_unstructured.py +0 -0
  66. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_2d_p1_unstructured.py +0 -0
  67. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_2d_p2_unstructured.py +0 -0
  68. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_2d_structured_grid.py +0 -0
  69. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_2d_structured_tetra.py +0 -0
  70. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_3d_base_structured.py +0 -0
  71. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_3d_p2_tetra.py +0 -0
  72. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_3d_structured_grid.py +0 -0
  73. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_3d_structured_tetra.py +0 -0
  74. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_3d_unstructured_tetra.py +0 -0
  75. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/__init__.py +0 -0
  76. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_aabb.py +0 -0
  77. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_base_support.py +0 -0
  78. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_face_table.py +0 -0
  79. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/interpolators/supports/_support_factory.py +0 -0
  80. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/__init__.py +0 -0
  81. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/core/__init__.py +0 -0
  82. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/core/fault_topology.py +0 -0
  83. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/core/geological_model.py +0 -0
  84. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/core/stratigraphic_column.py +0 -0
  85. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/__init__.py +0 -0
  86. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_analytical_feature.py +0 -0
  87. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_base_geological_feature.py +0 -0
  88. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_cross_product_geological_feature.py +0 -0
  89. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_feature_converters.py +0 -0
  90. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_geological_feature.py +0 -0
  91. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_lambda_geological_feature.py +0 -0
  92. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_projected_vector_feature.py +0 -0
  93. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_region.py +0 -0
  94. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_structural_frame.py +0 -0
  95. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/_unconformity_feature.py +0 -0
  96. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/builders/__init__.py +0 -0
  97. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/builders/_analytical_fold_builder.py +0 -0
  98. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/builders/_base_builder.py +0 -0
  99. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/builders/_folded_feature_builder.py +0 -0
  100. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/builders/_structural_frame_builder.py +0 -0
  101. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fault/__init__.py +0 -0
  102. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fault/_fault_function.py +0 -0
  103. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fault/_fault_function_feature.py +0 -0
  104. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fault/_fault_segment.py +0 -0
  105. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/__init__.py +0 -0
  106. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/_fold.py +0 -0
  107. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/_fold_rotation_angle_feature.py +0 -0
  108. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/_foldframe.py +0 -0
  109. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/_svariogram.py +0 -0
  110. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/fold_function/__init__.py +0 -0
  111. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/fold_function/_base_fold_rotation_angle.py +0 -0
  112. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/fold_function/_fourier_series_fold_rotation_angle.py +0 -0
  113. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/fold_function/_lambda_fold_rotation_angle.py +0 -0
  114. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/features/fold/fold_function/_trigo_fold_rotation_angle.py +0 -0
  115. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/input/__init__.py +0 -0
  116. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/input/fault_network.py +0 -0
  117. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/input/map2loop_processor.py +0 -0
  118. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/input/process_data.py +0 -0
  119. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/input/project_file.py +0 -0
  120. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/__init__.py +0 -0
  121. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/geom_conceptual_models.py +0 -0
  122. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/geometric_scaling_functions.py +0 -0
  123. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/intrusion_builder.py +0 -0
  124. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/intrusion_feature.py +0 -0
  125. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/intrusion_frame_builder.py +0 -0
  126. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/modelling/intrusions/intrusion_support_functions.py +0 -0
  127. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/__init__.py +0 -0
  128. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/_surface.py +0 -0
  129. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/_transformation.py +0 -0
  130. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/colours.py +0 -0
  131. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/config.py +0 -0
  132. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/dtm_creator.py +0 -0
  133. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/exceptions.py +0 -0
  134. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/features.py +0 -0
  135. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/helper.py +0 -0
  136. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/json_encoder.py +0 -0
  137. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/linalg.py +0 -0
  138. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/logging.py +0 -0
  139. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/observer.py +0 -0
  140. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/regions.py +0 -0
  141. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/typing.py +0 -0
  142. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/utils/utils.py +0 -0
  143. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural/visualisation/__init__.py +0 -0
  144. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural.egg-info/SOURCES.txt +0 -0
  145. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural.egg-info/dependency_links.txt +0 -0
  146. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural.egg-info/requires.txt +0 -0
  147. {loopstructural-1.6.23 → loopstructural-1.6.24}/LoopStructural.egg-info/top_level.txt +0 -0
  148. {loopstructural-1.6.23 → loopstructural-1.6.24}/README.md +0 -0
  149. {loopstructural-1.6.23 → loopstructural-1.6.24}/pyproject.toml +0 -0
  150. {loopstructural-1.6.23 → loopstructural-1.6.24}/setup.cfg +0 -0
  151. {loopstructural-1.6.23 → loopstructural-1.6.24}/setup.py +0 -0
@@ -62,7 +62,9 @@ class DiscreteInterpolator(GeologicalInterpolator):
62
62
  self.interpolation_weights = {}
63
63
  logger.info("Creating discrete interpolator with {} degrees of freedom".format(self.dof))
64
64
  self.type = InterpolatorType.BASE_DISCRETE
65
-
65
+ self.apply_scaling_matrix = True
66
+ self.add_ridge_regulatisation = True
67
+ self.ridge_factor = 1e-8
66
68
  def set_nelements(self, nelements: int) -> int:
67
69
  return self.support.set_nelements(nelements)
68
70
 
@@ -511,6 +513,25 @@ class DiscreteInterpolator(GeologicalInterpolator):
511
513
 
512
514
  B = np.hstack(bs)
513
515
  return A, B
516
+ def compute_column_scaling_matrix(self, A: sparse.csr_matrix) -> sparse.dia_matrix:
517
+ """Compute column scaling matrix S for matrix A so that A @ S has columns with unit norm.
518
+
519
+ Parameters
520
+ ----------
521
+ A : sparse.csr_matrix
522
+ interpolation matrix
523
+
524
+ Returns
525
+ -------
526
+ scipy.sparse.dia_matrix
527
+ diagonal scaling matrix S
528
+ """
529
+ col_norms = sparse.linalg.norm(A, axis=0)
530
+ scaling_factors = np.ones(A.shape[1])
531
+ mask = col_norms > 0
532
+ scaling_factors[mask] = 1.0 / col_norms[mask]
533
+ S = sparse.diags(scaling_factors)
534
+ return S
514
535
 
515
536
  def add_equality_block(self, A, B):
516
537
  if len(self.equal_constraints) > 0:
@@ -591,6 +612,15 @@ class DiscreteInterpolator(GeologicalInterpolator):
591
612
  raise ValueError("Pre solve failed")
592
613
 
593
614
  A, b = self.build_matrix()
615
+ if self.add_ridge_regulatisation:
616
+ ridge = sparse.eye(A.shape[1]) * self.ridge_factor
617
+ A = sparse.vstack([A, ridge])
618
+ b = np.hstack([b, np.zeros(A.shape[1])])
619
+ logger.info("Adding ridge regularisation to interpolation matrix")
620
+ if self.apply_scaling_matrix:
621
+ S = self.compute_column_scaling_matrix(A)
622
+ A = A @ S
623
+
594
624
  Q, bounds = self.build_inequality_matrix()
595
625
  if callable(solver):
596
626
  logger.warning('Using custom solver')
@@ -620,12 +650,14 @@ class DiscreteInterpolator(GeologicalInterpolator):
620
650
 
621
651
  elif solver == 'lsmr':
622
652
  logger.info("Solving using lsmr")
623
- if 'atol' not in solver_kwargs:
624
- if tol is not None:
625
- solver_kwargs['atol'] = tol
653
+ # if 'atol' not in solver_kwargs:
654
+ # if tol is not None:
655
+ # solver_kwargs['atol'] = tol
626
656
  if 'btol' not in solver_kwargs:
627
657
  if tol is not None:
628
658
  solver_kwargs['btol'] = tol
659
+ solver_kwargs['atol'] = 0.
660
+ logger.info(f"Setting lsmr btol to {tol}")
629
661
  logger.info(f"Solver kwargs: {solver_kwargs}")
630
662
  res = sparse.linalg.lsmr(A, b, **solver_kwargs)
631
663
  if res[1] == 1 or res[1] == 4 or res[1] == 2 or res[1] == 5:
@@ -684,6 +716,9 @@ class DiscreteInterpolator(GeologicalInterpolator):
684
716
  logger.error(f"Unknown solver {solver}")
685
717
  self.up_to_date = False
686
718
  # self._post_solve()
719
+ # apply scaling matrix to solution
720
+ if self.apply_scaling_matrix:
721
+ self.c = S @ self.c
687
722
  return self.up_to_date
688
723
 
689
724
  def update(self) -> bool: