MCPcopy Index your code
hub / github.com/Effect-TS/effect / astar

Function astar

packages/effect/src/Graph.ts:2699–2848  ·  view source on GitHub ↗
(
  graph: Graph<N, E, T> | MutableGraph<N, E, T>,
  config: AstarConfig<E, N>
)

Source from the content-addressed store, hash-verified

2697 * @category algorithms
2698 */
2699export const astar = <N, E, T extends Kind = "directed">(
2700 graph: Graph<N, E, T> | MutableGraph<N, E, T>,
2701 config: AstarConfig<E, N>
2702): Option.Option<PathResult<E>> => {
2703 const { cost, heuristic, source, target } = config
2704 // Validate that source and target nodes exist
2705 if (!graph.nodes.has(source)) {
2706 throw missingNode(source)
2707 }
2708 if (!graph.nodes.has(target)) {
2709 throw missingNode(target)
2710 }
2711
2712 // Early return if source equals target
2713 if (source === target) {
2714 return Option.some({
2715 path: [source],
2716 distance: 0,
2717 costs: []
2718 })
2719 }
2720
2721 // Get target node data for heuristic calculations
2722 const targetNodeData = graph.nodes.get(target)
2723 if (targetNodeData === undefined) {
2724 throw new Error(`Target node ${target} data not found`)
2725 }
2726
2727 // Distance tracking (g-score) and f-score (g + h)
2728 const gScore = new Map<NodeIndex, number>()
2729 const fScore = new Map<NodeIndex, number>()
2730 const previous = new Map<NodeIndex, { node: NodeIndex; edgeData: E } | null>()
2731 const visited = new Set<NodeIndex>()
2732
2733 // Initialize scores
2734 // Iterate directly over node keys
2735 for (const node of graph.nodes.keys()) {
2736 gScore.set(node, node === source ? 0 : Infinity)
2737 fScore.set(node, Infinity)
2738 previous.set(node, null)
2739 }
2740
2741 // Calculate initial f-score for source
2742 const sourceNodeData = graph.nodes.get(source)
2743 if (sourceNodeData !== undefined) {
2744 const h = heuristic(sourceNodeData, targetNodeData)
2745 fScore.set(source, h)
2746 }
2747
2748 // Priority queue using f-score (total estimated cost)
2749 const openSet: Array<{ node: NodeIndex; fScore: number }> = [
2750 { node: source, fScore: fScore.get(source)! }
2751 ]
2752
2753 while (openSet.length > 0) {
2754 // Find node with lowest f-score
2755 let minIndex = 0
2756 for (let i = 1; i < openSet.length; i++) {

Callers

nothing calls this directly

Calls 7

missingNodeFunction · 0.85
heuristicFunction · 0.85
getTraversableNeighborFunction · 0.85
keysMethod · 0.80
getMethod · 0.65
setMethod · 0.65
addMethod · 0.65

Tested by

no test coverage detected