# Reduce Exchange Between Client Session and Solver Session

As shown in Deploy an Application on AIMMS PRO, part of the overhead in solving is creating a case and transferring it, once from the client session to the solver session and once back. Especially, for short solves, the overhead can be relatively large. To reduce this overhead, we’ll reduce the number of identifiers that need to be passed between these sessions.

## The Identifiers Needed by the Solver Session

There are three groups of identifiers needed by the solver session that can be provided by the client session:

The sets and parameters used in defining mathematical program instances to be solved

The sets and parameters used in pre-processing and post-processing these mathematical programs

The subset of

`AllIdentifiers`

that contains those identifiers that comprise the solution; in other words those identifiers that need to be passed back to the client session.

In the declaration below, the variables and constraints that make up the mathematical program `FlowShopModel`

are the sets `sFlowshopConstraints`

and `sFlowshopVariables`

.

MathematicalProgram FlowShopModel { Objective: TimeSpan; Direction: minimize; Constraints: sFlowshopConstraints; Variables: sFlowshopVariables; } Set sFlowshopConstraints { SubsetOf: AllConstraints; Definition: AllConstraints * Flowshop_Mathematical_Program_Declarations; } Set sFlowshopVariables { SubsetOf: AllVariables; Definition: AllVariables * Flowshop_Mathematical_Program_Declarations; }

To determine which identifiers make up the mathematical program instance we need to know which identifiers are referenced in the variable and constraint definitions. We use the function `ReferencedIdentifiers`

for this as follows:

sInputIds := ! Identifiers from mathematical program: sFlowshopConstraints + sFlowshopVariables + data { TimeSpan } + ! Identifiers from the section where the solution process is coded: Solution_Work_horses ; sInputIds := sInputIds + ! For bounds on variables, scaling factors, etc ! Ensure that all identifiers referenced in these variables ! and constraints are in the input case. ReferencedIdentifiers( sInputIds, AllAttributeNames, recursive: 1 ) + ! Stash list of identifiers to be returned. data { sOutputIds } ;

Now we only to construct the set of output identifiers, i.e. those identifiers that should be in the case send from the solver session to the client session. The client session only needs the Gantt Chart starts and durations. So that is simply:

sOutputIds := data { pGCJobStart, pGCJobDuration };

Now we have constructed the sets of identifiers that need to be passed from the client session to the solver session (`sInputIds`

) and the set of identifiers to be passed from the solver session to the client session (`sOutputIds`

), we need to pass this information to AIMMS PRO, such that `pro::DelegateToServer`

correctly handles this. For this purpose, AIMMS PRO declares the following sets: `pro::ManagedSessionInputCaseIdentifierSet`

and `pro::ManagedSessionOutputCaseIdentifierSet`

.

The

`pro::ManagedSessionInputCaseIdentifierSet`

needs to be assigned**before**calling the procedure`pro::DelegateToServer`

, for instance as follows:pro::ManagedSessionInputCaseIdentifierSet := sInputIds ;

The

`pro::ManagedSessionOutputCaseIdentifierSet`

needs to be assigned**during**the execution of the solver session. For instance as follows:if pro::DelegateToServer( waitForCompletion: 1, completionCallback: 'pro::session::LoadResultsCallBack' ) then return 1; endif ; prDoSolve(); pro::ManagedSessionOutputCaseIdentifierSet := sOutputIds ;

## Summary

In this article, we’ve shown how to reduce the overhead of creating and communicating cases between the client session and the solver session.

## Further Reading

See also the section on input and output case definitions in AIMMS PRO documentation

The descriptions of the functions

`ReferencedIdentifiers`

and`SectionIdentifiers`

.

You can download the example:
`2a. Flow Shop - ReducedCases`

.