|
| 1 | +(= (createInitialInstance $dscMp) |
| 2 | + (let* ( |
| 3 | + ($knobs (MultiMap.values $dscMp)) |
| 4 | + ($defaults (List.map getKnobDefault $knobs)) |
| 5 | + ) |
| 6 | + $defaults)) |
| 7 | + |
1 | 8 | ;; Recursively optimizes each deme in a list using the provided optimizer function. |
2 | 9 | ;; Params: |
3 | 10 | ;; (List Deme): The list of demes to optimize. |
4 | | -;; $truthTableBScore: The scoring function or object. |
| 11 | +;; $context: The scoring context - either TruthTableBScore or tuple ($nGames $opponentPolicy) |
5 | 12 | ;; $inst: The initial instance for optimization. |
6 | 13 | ;; $optimize: The optimizer function to apply to each deme. |
7 | 14 | ;; Returns: (List Deme): A new list where each deme has been optimized. |
8 | | -(: optimizeDemes (-> (List Deme) (TruthTableBScore $a) Instance (-> Deme (TruthTableBScore $a) Instance $Scorer (Instance Deme $state)) $Scorer (List (Instance Deme $state)))) |
9 | | -(= (optimizeDemes $deme $truthTableBScore $inst $optimize ($scorer $FsScorer)) |
10 | | -($optimize $deme $truthTableBScore $inst ($scorer $FsScorer))) |
| 15 | +; (: optimizeDemes (-> (List Deme) $context Instance $optimize (Instance Deme $state))) |
| 16 | +;; Game strategy version - unpacks tuple with target score |
| 17 | +;; Strategy version - unpacks game parameters and calls hillClimbing with mkParams |
| 18 | +(= (optimizeDemes $deme ($nGames $opponentPolicy $complexityRatio $targetCScore) $inst $optimize) |
| 19 | + ($optimize $deme $targetCScore $inst (mkParams applyStrategyBasedScore ($nGames $opponentPolicy $complexityRatio)))) |
| 20 | +;; Boolean version - passes context as-is |
| 21 | +(= (optimizeDemes $deme $context $inst $optimize) |
| 22 | + ($optimize $deme $context $inst)) |
| 23 | + |
| 24 | +;; Extracts default specification from a knob |
| 25 | +; (: getKnobDefault (-> $knob Number)) |
| 26 | +(= (getKnobDefault (mkLSK (mkDiscKnob $knob $multip $curr (mkDiscSpec $def) $dis))) $def) |
| 27 | +(= (getKnobDefault (mkSSK (mkDiscKnob $knob $multip $curr (mkDiscSpec $def) $dis))) $def) |
11 | 28 |
|
12 | 29 | ;; Runs one deme-creation and optimization step, then merges the optimized deme into the metapopulation. |
13 | 30 | ;; Params: |
|
25 | 42 | ;; $capCoef: Capacity coefficient for resizing. |
26 | 43 | ;; $genCount: Generation count for resizing. |
27 | 44 | ;; Returns: |
28 | | -;; $updatedMetaPop: Updated metapopulation with the new optimized deme merged in. |
29 | | -(: expandDeme (-> (OS (Exemplar $a)) Number Number Bool Symbol (TruthTableBScore $a) (-> Deme (TruthTableBScore $a) Instance $Scorer (Instance Deme $state)) $Scorer Number Number Number Number (ITable $a) Number Number Number (OS (Exemplar $a)))) |
30 | | -(= (expandDeme $metaPop $nExpansion $nDeme $prune-exemplar $fs-algo $truthTableBScore $optimize $optimScorer $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $itable $nToKeep $capCoef $genCount) |
31 | | -(collapse |
32 | | - (let* |
33 | | -( |
34 | | - ($exemplar (trace! "Selecting Exemplar" (selectExemplar $metaPop))) |
35 | | - (() (println! $exemplar)) |
| 45 | + ;; $updatedMetaPop: Updated metapopulation with the new optimized deme merged in. |
| 46 | +; (: expandDeme (-> (OS (Exemplar $a)) Number Number Bool Symbol (TruthTableBScore $a) (-> Deme (TruthTableBScore $a) Instance $Scorer (Instance Deme $state)) $Scorer Number Number Number Number (ITable $a) Number Number Number (OS (Exemplar $a)))) |
| 47 | +(= (expandDeme $metaPop $nExpansion $nDeme $prune-exemplar $fs-algo $truthTableBScore $optimize $itable $scorerType) |
| 48 | +(let* |
| 49 | + ( |
| 50 | + ;; ($_ (println! "")) |
| 51 | + ;; ($_ (println! (MetaPop: $metaPop))) |
| 52 | + ;; ($_ (println! "Selecting Exemplar")) |
| 53 | + ($exemplar (selectExemplar $metaPop)) |
| 54 | + ;; ($_ (println! $exemplar)) |
| 55 | + ;; ($_ (println! "getting exemplar tree")) |
36 | 56 | ($tree (getExemplarTree $exemplar)) |
| 57 | + ($_ (println! (SelectedTree: (preOrder $tree)))) |
| 58 | + ;; ($_ (println! "creating deme IDs")) |
37 | 59 | ($demeIds (createDemeIds $nExpansion $nDeme)) |
| 60 | + ;; ($_ (println! $demeIds)) |
38 | 61 | ; ($argLabels (getArgLabels $itable)) |
39 | | - ($demes (trace! "Creating Deme" (createDeme $nDeme $demeIds $tree $itable $fs-algo $prune-exemplar () $scorerType))) ;;createRepresentation and createDemeId are under this |
40 | | - ((mkDeme (mkRep (mkKbMap (mkDscKbMp $dscKbMp) (mkDscMp $dscMp)) $updatedTree) $sInstList $demeId) (superpose $demes)) |
| 62 | + ;; ($_ (println! "Creating Deme")) |
| 63 | + ($demes (createDeme $nDeme $demeIds $tree $itable $fs-algo $prune-exemplar () $scorerType)) |
| 64 | + ) |
| 65 | + (map-atom $demes $deme (expandDemeHelper $deme $truthTableBScore $optimize)) |
| 66 | + )) |
| 67 | + |
| 68 | +;; Overloaded version for game strategy domain - 8 parameters |
| 69 | +(= (expandDeme $metaPop $nExpansion $nDeme $nGames $opponentPolicy $complexityRatio $targetCScore $optimize) |
| 70 | + (let* |
| 71 | + ( |
| 72 | + ($exemplar (trace! "Selecting Exemplar" (selectExemplar $metaPop))) |
| 73 | + ($tree (trace! "getting exemplar tree" (getExemplarTree $exemplar))) |
| 74 | + ($demeIds (trace! "creating deme IDs" (createDemeIds $nExpansion $nDeme))) |
| 75 | + ($demes (trace! "Creating Deme" (createDeme $nDeme $demeIds $tree))) |
| 76 | + ($gameContext ($nGames $opponentPolicy $complexityRatio $targetCScore)) |
| 77 | + ) |
| 78 | + (map-atom $demes $deme (expandDemeHelper $deme $gameContext $optimize)))) |
| 79 | + |
| 80 | +;; Unified helper for both Boolean and Strategy domains |
| 81 | +;; Optimizes each deme in the list using the provided optimizer and context |
| 82 | +;; Params: |
| 83 | +;; $deme: Deme to optimize |
| 84 | +;; $context: Scoring context (ITable for Boolean, tuple for Strategy) |
| 85 | +;; $optimize: Optimizer function |
| 86 | +;; Returns: Optimized deme with scored instances |
| 87 | +(= (expandDemeHelper (mkDeme (mkRep (mkKbMap (mkDscKbMp $dscKbMp) (mkDscMp $dscMp)) $updatedTree) $sInstList $demeId) $context $optimize) |
| 88 | +(let* |
| 89 | +( |
41 | 90 | ($lengthOfDscKbMp (Map.length $dscKbMp)) |
42 | | - ($generatedList (List.generate $lengthOfDscKbMp 0)) |
| 91 | + ;; ($generatedList (List.generate $lengthOfDscKbMp 0)) |
| 92 | + ($generatedList (createInitialInstance $dscMp)) |
43 | 93 | ($deme (mkDeme (mkRep (mkKbMap (mkDscKbMp $dscKbMp) (mkDscMp $dscMp)) $updatedTree) $sInstList $demeId)) |
44 | | - (($inst $optimDeme $state) (trace! "Optimizing Deme" (optimizeDemes $deme $truthTableBScore (mkInst $generatedList) $optimize $optimScorer))) ;; the hillclimbing is called under this and it calls the neighborhood and stuff to first populate the deme with instances |
| 94 | + ;; ($_ (println! (Rep: (mkRep (mkKbMap (mkDscKbMp $dscKbMp) (mkDscMp $dscMp)) $updatedTree)))) |
| 95 | + ;; ($_ (println! "Optimizing Deme")) |
| 96 | + (($inst $optimDeme $state) (optimizeDemes $deme $context (mkInst $generatedList) $optimize)) |
45 | 97 | ) |
46 | | -$optimDeme))) |
47 | | - |
| 98 | +$optimDeme |
| 99 | +)) |
48 | 100 | ;; The main loop |
49 | 101 | ;; Takes 2 termination criterias: |
50 | 102 | ;; - $maxGen : how many times we want the loop to run |
51 | 103 | ;; - $maxScore : the maximum score we want the top Examplar to have |
52 | 104 | ;; It also takes: |
53 | 105 | ;; - $maxCandOutput : The number of candidates to be returned |
54 | 106 | ;; - other parameters required by the expandDeme method |
55 | | -(: runMoses (-> Number Cscore Number (OS (Exemplar $a)) Number Number Bool Symbol (TruthTableBScore $a) (-> Deme (TruthTableBScore $a) Instance $Scorer (Instance Deme $state)) $Scorer Number Number Number Number (ITable $a) Number Number Number (OS (Exemplar $a)))) |
56 | | -(= (runMoses $maxGen $maxScore $maxCandOutput $metaPop $nExpansion $nDeme $prune-exemplar $fs-algo $truthTableBScore $optimize $optimScorer $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $itable $nToKeep $capCoef $genCount) |
| 107 | +; (: runMoses (-> Number Cscore Number (OS (Exemplar $a)) Number Number Bool Symbol (TruthTableBScore $a) (-> Deme (TruthTableBScore $a) Instance $Scorer (Instance Deme $state)) $Scorer Number Number Number Number (ITable $a) Number Number Number (OS (Exemplar $a)))) |
| 108 | +;; TODO: $nEval isn't being used. Increase it so that it works as expected. |
| 109 | +;; To enable that, we may need to change our termination condition so that the generation is equivalent to the number of expansion as well. |
| 110 | +;; The number of expansions in the open cog classic is equivalent to the number of deme expansions. That looks like the same thing we are doing here but not sure. |
| 111 | +(= (runMoses $maxGen $maxScore $maxCandOutput $metaPop $nExpansion $nDeme $context $optimize $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $nToKeep $capCoef $genCount) |
57 | 112 | (if (== $maxGen 0) |
58 | 113 | (if (<= $maxCandOutput (OS.length $metaPop)) |
59 | 114 | (let $topCandidates (OS.getTopN $maxCandOutput $metaPop) $topCandidates) |
60 | 115 | $metaPop |
61 | 116 | ) |
62 | | - ; (trace! ($maxCandOutput $metaPop) (let $topCandidates (OS.getTopN $maxCandOutput $metaPop) $topCandidates)) |
63 | | - (let* |
| 117 | + (let* |
64 | 118 | ( |
65 | | - ($optimizedDemes (expandDeme $metaPop $nExpansion $nDeme $prune-exemplar $fs-algo $truthTableBScore $optimize $optimScorer $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $itable $nToKeep $capCoef $genCount)) |
66 | | - ($updatedMetaPop (trace! "Merging Deme" (mergeDemes $optimizedDemes $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $itable $metaPop $nToKeep $capCoef $genCount))) |
| 119 | + ($_ (println! (Generation $maxGen))) |
| 120 | + ($optimizedDemes (case $context |
| 121 | + ((($prune-exemplar $fs-algo $truthTableBScore $itable) (trace! "expand deme returnn" (expandDeme $metaPop $nExpansion $nDeme $prune-exemplar $fs-algo $truthTableBScore $optimize $itable mi))) |
| 122 | + (($nGames $opponentPolicy $complexityRatio) (trace! "expand deme return" (expandDeme $metaPop $nExpansion $nDeme $nGames $opponentPolicy $complexityRatio $maxScore $optimize)))))) |
| 123 | + (((mkDeme $rep $sInst $demeId)) $optimizedDemes) |
| 124 | + ($_ (println! (OptimizedDeme: (List.length (second $sInst))))) |
| 125 | + ($updatedMetaPop (case $context |
| 126 | + ((($prune-exemplar $fs-algo $truthTableBScore $itable) (trace! "Merging Deme" (mergeDemes $optimizedDemes $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $itable $metaPop $nToKeep $capCoef $genCount))) |
| 127 | + (($nGames $opponentPolicy $complexityRatio) (trace! "Merging Deme" (mergeDemes $optimizedDemes $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature ($nGames $opponentPolicy) $metaPop $nToKeep $capCoef $genCount)))))) |
| 128 | + ;; ($_ (println! (Updated MetaPop: $updatedMetaPop))) |
67 | 129 | ($top (OS.getByIdx 0 $metaPop)) |
| 130 | + ;; ($_ (println! (Top Exemplar before expansion: $top))) |
68 | 131 | ($topScore (getExemplarCscore $top)) |
69 | | - ($topCandidates (OS.getTopN $maxCandOutput $metaPop))) |
70 | | - (if (cScore>= $topScore $maxScore) |
71 | | - $topCandidates |
72 | | - (runMoses (- $maxGen 1) $maxScore $maxCandOutput $updatedMetaPop $nExpansion $nDeme $prune-exemplar $fs-algo $truthTableBScore $optimize $optimScorer $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $itable $nToKeep $capCoef $genCount))))) |
| 132 | + ;; ($_ (println! (topscore: $topScore))) |
| 133 | + ($resultCandi (if (<= $maxCandOutput (OS.length $updatedMetaPop)) (OS.getTopN $maxCandOutput $updatedMetaPop) $updatedMetaPop)) |
| 134 | + ;; ($_ (println! (Top: $topScore Max: $maxScore (cScore>= $topScore $maxScore)))) |
| 135 | + ($_ (cut)) |
| 136 | + ($_ (println! "")) |
| 137 | + ) |
| 138 | + (if (== $topScore $maxScore) |
| 139 | + $resultCandi |
| 140 | + (runMoses (- $maxGen 1) $maxScore $maxCandOutput $updatedMetaPop $nExpansion $nDeme $context $optimize $nEval $maxCandsPerDeme $minPoolSize $complexityTemperature $nToKeep $capCoef $genCount))))) |
| 141 | + |
| 142 | + |
| 143 | +;; Some helpers specific to final testing |
| 144 | +(= (mapG $f NilOS) NilOS) |
| 145 | +(= (mapG $f Nil) Nil) |
| 146 | +(= (mapG $f ($ctor $x $xs)) ($ctor ($f $x) (mapG $f $xs))) |
| 147 | + |
| 148 | +(= (printExemplar (mkExemplar $tree $demeId $cscore $bscore)) (println! (Tree: (preOrder $tree) CScore: $cscore Bscore: $bscore))) |
| 149 | +(= (cleanedExemplar (mkExemplar $tree $demeId $cscore (mkBScore $bscore))) ((preOrder $tree) (List.sum $bscore))) |
| 150 | + |
| 151 | +(= (printInstance (mkInst $inst)) (println! (List.listToExpr $inst))) |
0 commit comments