@@ -19,16 +19,20 @@ import {
1919 useNodesState ,
2020} from "reactflow" ;
2121import "reactflow/dist/style.css" ;
22+ import { MetaSolverStrategyDto } from "../../../api/strategy/data-model/MetaSolverStrategyDto" ;
23+ import { strategyApi } from "../../../api/strategy/StrategyAPI" ;
2224import { ProblemDto } from "../../../api/toolbox/data-model/ProblemDto" ;
2325import { ProblemSolverInfo } from "../../../api/toolbox/data-model/ProblemSolverInfo" ;
2426import { ProblemState } from "../../../api/toolbox/data-model/ProblemState" ;
2527import { SubRoutineDefinitionDto } from "../../../api/toolbox/data-model/SubRoutineDefinitionDto" ;
2628import { SubRoutineReferenceDto } from "../../../api/toolbox/data-model/SubRoutineReferenceDto" ;
2729import { toolboxApi } from "../../../api/toolbox/ToolboxAPI" ;
2830import { SolutionView } from "../SolutionView" ;
31+ import { useMetaSolverStrategies } from "./MetaSolverStrategyProvider" ;
2932import { LevelInfo , ProblemNode , ProblemNodeData } from "./ProblemNode" ;
30- import { SolverNode } from "./SolverNode" ;
33+ import { SolverNode , SolverNodeData } from "./SolverNode" ;
3134import { useSolvers } from "./SolverProvider" ;
35+ import { StrategyNode , StrategyNodeData } from "./StrategyNode" ;
3236
3337interface ProblemEdgeData {
3438 sourceProblemDto : ProblemDto < any > ;
@@ -76,7 +80,7 @@ function getChildNodes(
7680 typeId ?: string
7781) : Node [ ] {
7882 return nodes . filter ( ( n ) => {
79- if ( n . type !== "problemNode" ) return false ;
83+ if ( n . type !== "problemNode" && n . type !== "strategyNode" ) return false ;
8084 if ( ! n . id . startsWith ( parentNode . id ) ) return false ;
8185
8286 const subString = n . id . substring ( parentNode . id . length + 1 ) ;
@@ -126,10 +130,13 @@ function groupBySolver(problemDtos: ProblemDto<any>[]) {
126130
127131const nodeTypes : NodeTypes = {
128132 solverNode : SolverNode ,
133+ strategyNode : StrategyNode ,
129134 problemNode : ProblemNode ,
130135} ;
131136const solverNodeIdentifier : string = "-solver-node-" ;
132137const solverEdgeIdentifier : string = "-solver-edge-" ;
138+ const strategyNodeIdentifier : string = "-strategy-node-" ;
139+ const strategyEdgeIdentifier : string = "-strategy-edge-" ;
133140
134141export interface GraphUpdateProps {
135142 updateProblem : ( problemId : string ) => void ;
@@ -151,6 +158,7 @@ export const ProblemGraphView = (props: ProblemGraphViewProps) => {
151158 const solutionViewRef = useRef < HTMLDivElement > ( null ) ;
152159
153160 const { getSolvers } = useSolvers ( ) ;
161+ const { getStrategies } = useMetaSolverStrategies ( ) ;
154162
155163 /**
156164 * Node updates are scheduled in order to provide an asynchronous update mechanism.
@@ -226,15 +234,79 @@ export const ProblemGraphView = (props: ProblemGraphViewProps) => {
226234
227235 const createSolverNodes = useCallback (
228236 ( node : Node < ProblemNodeData > ) => {
237+ getStrategies ( node . data . problemDtos [ 0 ] . typeId ) . then ( ( strategies ) => {
238+ console . log ( "strategies" , strategies ) ;
239+ for ( let i = 0 ; i < strategies . length ; i ++ ) {
240+ let strategyNodeId =
241+ node . id + strategyNodeIdentifier + strategies [ i ] . id . toString ( ) ;
242+
243+ const strategyNode : Node < StrategyNodeData > = {
244+ id : strategyNodeId ,
245+ data : {
246+ strategy : strategies [ i ] ,
247+ selectCallback : ( strategy : MetaSolverStrategyDto ) => {
248+ let edge = edges . find ( ( e ) =>
249+ e . target . startsWith ( node . id + strategyEdgeIdentifier )
250+ ) ;
251+ if ( edge ) {
252+ updateEdge ( edge ) ;
253+ }
254+
255+ Promise . all (
256+ node . data . problemDtos . map ( ( problemDto ) =>
257+ strategyApi . executeStrategy ( strategy . id , problemDto . id )
258+ )
259+ ) . then ( ( results ) => {
260+ setNodes ( ( previousNodes ) =>
261+ previousNodes . map ( ( n ) => {
262+ if ( n . id !== node . id ) return n ;
263+
264+ let updatedNode : Node < ProblemNodeData > = {
265+ ...n ,
266+ data : {
267+ ...n . data ,
268+ problemDtos : results
269+ . map ( ( r ) => r . result )
270+ . filter (
271+ ( dto ) : dto is ProblemDto < any > => dto !== undefined
272+ ) ,
273+ } ,
274+ } ;
275+ scheduleNodeUpdate ( updatedNode ) ;
276+
277+ return updatedNode ;
278+ } )
279+ ) ;
280+ } ) ;
281+ } ,
282+ } ,
283+ position : {
284+ x :
285+ node . position . x +
286+ getNodePositionX ( { index : i , count : strategies . length } ) ,
287+ y : getNodePositionY ( node . data . level + 1.5 ) ,
288+ } ,
289+ type : "strategyNode" ,
290+ } ;
291+
292+ addNode ( strategyNode ) ;
293+
294+ addEdge ( {
295+ id : node . id + solverEdgeIdentifier + strategyNodeId ,
296+ type : "step" ,
297+ source : node . id ,
298+ target : strategyNodeId ,
299+ } ) ;
300+ }
301+ } ) ;
229302 getSolvers ( node . data . problemDtos [ 0 ] . typeId ) . then ( ( solvers ) => {
230303 for ( let i = 0 ; i < solvers . length ; i ++ ) {
231304 let solverId =
232305 node . id + solverNodeIdentifier + solvers [ i ] . id . toString ( ) ;
233306
234- addNode ( {
307+ const solverNode : Node < SolverNodeData > = {
235308 id : solverId ,
236309 data : {
237- problemIds : node . data . problemDtos . map ( ( x ) => x . id ) ,
238310 problemSolver : solvers [ i ] ,
239311 selectCallback : ( problemSolver : ProblemSolverInfo ) => {
240312 let edge = edges . find ( ( e ) =>
@@ -277,7 +349,9 @@ export const ProblemGraphView = (props: ProblemGraphViewProps) => {
277349 y : getNodePositionY ( node . data . level + 1 ) ,
278350 } ,
279351 type : "solverNode" ,
280- } ) ;
352+ } ;
353+
354+ addNode ( solverNode ) ;
281355
282356 addEdge ( {
283357 id : node . id + solverEdgeIdentifier + solverId ,
@@ -293,6 +367,7 @@ export const ProblemGraphView = (props: ProblemGraphViewProps) => {
293367 addNode ,
294368 edges ,
295369 getSolvers ,
370+ getStrategies ,
296371 scheduleNodeUpdate ,
297372 setNodes ,
298373 updateEdge ,
@@ -303,11 +378,17 @@ export const ProblemGraphView = (props: ProblemGraphViewProps) => {
303378 ( node : Node < ProblemNodeData > ) => {
304379 setNodes ( ( previousNodes ) =>
305380 previousNodes . filter (
306- ( n ) => ! n . id . startsWith ( node . id + solverNodeIdentifier )
381+ ( n ) =>
382+ ! n . id . startsWith ( node . id + solverNodeIdentifier ) &&
383+ ! n . id . startsWith ( node . id + strategyNodeIdentifier )
307384 )
308385 ) ;
309386 setEdges ( ( edges ) =>
310- edges . filter ( ( e ) => ! e . id . startsWith ( node . id + solverEdgeIdentifier ) )
387+ edges . filter (
388+ ( e ) =>
389+ ! e . id . startsWith ( node . id + solverEdgeIdentifier ) &&
390+ ! e . id . startsWith ( node . id + strategyEdgeIdentifier )
391+ )
311392 ) ;
312393 } ,
313394 [ setEdges , setNodes ]
0 commit comments