#ifndef LARDON3D_ACQUISITION_CAMPAIGN_H #define LARDON3D_ACQUISITION_CAMPAIGN_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define LARDON3D_ACQUISITION_CAMPAIGN_MAX_ROOTS 64u #define LARDON3D_ACQUISITION_CAMPAIGN_MAX_SOURCES 4096u #define LARDON3D_ACQUISITION_CAMPAIGN_MAX_GROUPS 4096u #define LARDON3D_ACQUISITION_CAMPAIGN_MAX_PROPOSALS 4096u #define LARDON3D_ACQUISITION_CAMPAIGN_PATH_CAPACITY LARDON3D_APP_STATE_PATH_CAPACITY typedef enum { LARDON3D_ACQUISITION_CAMPAIGN_OK = 0, LARDON3D_ACQUISITION_CAMPAIGN_INVALID_ARGUMENT, LARDON3D_ACQUISITION_CAMPAIGN_IO_ERROR, LARDON3D_ACQUISITION_CAMPAIGN_DUPLICATE, LARDON3D_ACQUISITION_CAMPAIGN_PATH_TOO_LONG, LARDON3D_ACQUISITION_CAMPAIGN_LIMIT_EXCEEDED, LARDON3D_ACQUISITION_CAMPAIGN_CONSTRAINT, LARDON3D_ACQUISITION_CAMPAIGN_INGEST_ERROR, LARDON3D_ACQUISITION_CAMPAIGN_INTERNAL_ERROR } Lardon3DAcquisitionCampaignResult; typedef struct { char path[LARDON3D_ACQUISITION_CAMPAIGN_PATH_CAPACITY]; } Lardon3DAcquisitionCampaignRoot; typedef struct { char path[LARDON3D_ACQUISITION_CAMPAIGN_PATH_CAPACITY]; Lardon3DAcquisitionSourceKind source_kind; Lardon3DAcquisitionResult metadata_result; Lardon3DAcquisitionMetadata metadata; } Lardon3DAcquisitionCampaignSource; typedef struct { size_t discovered_entry_count; size_t supported_source_count; size_t unsupported_entry_count; size_t metadata_ok_count; size_t metadata_error_count; } Lardon3DAcquisitionCampaignDiscoverySummary; typedef struct { size_t source_count; Lardon3DAcquisitionCampaignSource sources[LARDON3D_ACQUISITION_CAMPAIGN_MAX_SOURCES]; Lardon3DAcquisitionCampaignDiscoverySummary summary; } Lardon3DAcquisitionCampaignDiscovery; typedef struct { size_t source_count; size_t source_indices[LARDON3D_ACQUISITION_INGEST_MAX_SOURCES]; } Lardon3DAcquisitionCampaignConfirmation; typedef enum { LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_CANDIDATE = 1, LARDON3D_ACQUISITION_CAMPAIGN_PROPOSAL_AMBIGUOUS = 2 } Lardon3DAcquisitionCampaignProposalKind; typedef struct { size_t left_source_index; size_t right_source_index; Lardon3DAcquisitionCampaignProposalKind kind; Lardon3DAcquisitionPairResult pair; } Lardon3DAcquisitionCampaignProposal; typedef struct { uint32_t group_id; Lardon3DAcquisitionGroupBasis basis; size_t source_count; size_t source_indices[LARDON3D_ACQUISITION_INGEST_MAX_SOURCES]; } Lardon3DAcquisitionCampaignGroup; typedef struct { size_t source_count; size_t metadata_ok_count; size_t metadata_error_count; size_t strong_group_count; size_t explicit_group_count; size_t unresolved_source_count; size_t ambiguous_pair_count; size_t contradictory_pair_count; size_t insufficient_pair_count; size_t candidate_pair_count; } Lardon3DAcquisitionCampaignPlanSummary; typedef struct { size_t group_count; Lardon3DAcquisitionCampaignGroup groups[LARDON3D_ACQUISITION_CAMPAIGN_MAX_GROUPS]; size_t proposal_count; Lardon3DAcquisitionCampaignProposal proposals[LARDON3D_ACQUISITION_CAMPAIGN_MAX_PROPOSALS]; Lardon3DAcquisitionCampaignPlanSummary summary; } Lardon3DAcquisitionCampaignPlan; /* * Roots must be absolute and lexically normalized. Only their immediate regular-file * entries are considered. Symlinks are never followed. Extensions .arw, .jpg and .jpeg * are supported case-insensitively; all other immediate entries are counted as unsupported. */ Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_discover( const Lardon3DAcquisitionCampaignRoot *roots, size_t root_count, Lardon3DAcquisitionCampaignDiscovery *discovery); /* * Pure planning over caller-supplied normalized source/evidence records. * The summary counts all evaluated pair evidence. If review proposals exceed * MAX_PROPOSALS, the plan retains their deterministic source-pair-order prefix; * proposal capacity never changes grouping or the scientific evidence rules. */ Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_plan( const Lardon3DAcquisitionCampaignSource *sources, size_t source_count, const Lardon3DAcquisitionCampaignConfirmation *confirmations, size_t confirmation_count, Lardon3DAcquisitionCampaignPlan *plan); /* Materializes exactly one stable plan group. Retain capture_id before retrying with it. */ Lardon3DAcquisitionCampaignResult lardon3d_acquisition_campaign_materialize_group( Lardon3DAppState *state, uint64_t scanset_id, const Lardon3DAcquisitionCampaignSource *sources, size_t source_count, const Lardon3DAcquisitionCampaignPlan *plan, uint32_t group_id, const Lardon3DAcquisitionIngestOptions *options, Lardon3DAcquisitionIngestOutput *output, Lardon3DAcquisitionIngestResult *ingest_result); #ifdef __cplusplus } #endif #endif