memory grows when using flip geodesics shortening the same paths
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- cpp
- Ambito
- computer-graphics, performance
Direzione di ricerca
Reproduce the repeated calls in the provided C++ program, starting with geometrycentral/surface/flip_geodesics.h and the FlipEdgeNetwork calls reinitializePath(), iterativeShorten(), and rewind(). Track resident memory across repeated runs and inspect the lifecycle of those operations. Done means repeated shortening of the same path no longer causes unexplained memory growth.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
When I follow the official documentation to call the flip geodesics algorithm multiple times on the same dataset, the memory usage keeps growing.
Shortening many paths,doc: https://geometry-central.net/surface/algorithms/flip_geodesics/
I'm a C++ beginner, and with the help of the documentation and ChatGPT, I wrote the following program:
#include <fstream>
#include <vector>
#include <chrono>
#include "geometrycentral/surface/flip_geodesics.h"
#include "geometrycentral/surface/vertex_position_geometry.h"
#include "geometrycentral/surface/meshio.h"
#include "geometrycentral/surface/mesh_graph_algorithms.h"
#include <mach/mach.h>
#include <iostream>
#include <mach/task.h>
#include <mach/mach_init.h>
#include <libproc.h> // for proc_pidinfo() on some macOS versions
#include <sys/types.h> // for pid_t
#include <unistd.h> // for getpid() and getrusage()
#include <sys/resource.h> // for getrusage()
using namespace geometrycentral;
using namespace geometrycentral::surface;
int computeFlipGeodesicPath(
std::unique_ptr<FlipEdgeNetwork> &edgeNetwork,
int vertex0,
int vertex1)
{
Vertex startVert = edgeNetwork->tri->intrinsicMesh->vertex(vertex0); // populate these somehow
Vertex endVert = edgeNetwork->tri->intrinsicMesh->vertex(vertex1);
// Get an initial dijkstra path
// (surface/mesh_graph_algorithms.h)
std::vector<Halfedge> dijkstraPath = shortestEdgePath(*edgeNetwork->tri, startVert, endVert);
// Reinitialize the ede network to contain this path
edgeNetwork->reinitializePath({dijkstraPath});
// Straighten the path to geodesic
edgeNetwork->iterativeShorten();
// Extract the path and store it in the vector
// std::vector<Vector3> path3D = edgeNetwork->getPathPolyline3D().front();
// Be kind, rewind
edgeNetwork->rewind();
return 1;
}
int main()
{
using namespace std::chrono;
std::unique_ptr<ManifoldSurfaceMesh> mesh;
std::unique_ptr<VertexPositionGeometry> geom;
std::tie(mesh, geom) = readManifoldSurfaceMesh("/Downloads/test.obj");
std::unique_ptr<FlipEdgeNetwork> edgeNetwork(new FlipEdgeNetwork(*mesh, *geom, {}));
edgeNetwork->supportRewinding = true;
edgeNetwork->posGeom = geom.get();
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
// 1
computeFlipGeodesicPath(edgeNetwork, 36841, 29806);
if (KERN_SUCCESS != task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
{
std::cerr << "task_info() failed" << std::endl;
return 1;
}
std::cout << "Resident Memory Size: " << t_info.resident_size / 1024 / 1024 << " MB" << std::endl;
// 2
computeFlipGeodesicPath(edgeNetwork, 36841, 29806);
if (KERN_SUCCESS != task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
{
std::cerr << "task_info() failed" << std::endl;
return 1;
}
std::cout << "Resident Memory Size: " << t_info.resident_size / 1024 / 1024 << " MB" << std::endl;
// 3
computeFlipGeodesicPath(edgeNetwork, 36841, 29806);
if (KERN_SUCCESS != task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count))
{
std::cerr << "task_info() failed" << std::endl;
return 1;
}
std::cout << "Resident Memory Size: " << t_info.resident_size / 1024 / 1024 << " MB" << std::endl;
return 0;
}
result:
obj file:
test.obj.zip
- Lingua principale
- C++
- Stelle
- 1.3k
- Fork
- 183
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di nmwsharp/geometry-central
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
nmwsharp/geometry-central#256 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
nmwsharp/geometry-central#255 · 1 commento ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
nmwsharp/geometry-central#253 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 57/100
nmwsharp/geometry-central#247 ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
nmwsharp/geometry-central#246 ·
Tutte le issue di nmwsharp/geometry-central
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
flutter-webrtc/flutter-webrtc#2206 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
Component: GLib
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
brave/brave-browser#59300 ·
-
Mute ydb/tests/functional/dstool/test_canonical_requests.py.Test.test_group_take_snapshot in main Apertaai_reviewed
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
ydb-platform/ydb#53974 · 3 commenti ·