/// <summary> Wrapper method of RequestMultiSlotDecisionDetailed </summary> public override MultiSlotResponseDetailedWrapper RequestMultiSlotDecisionDetailed(string eventId, string contextJson, ActionFlags flags, int[] baselineActions) { MultiSlotResponseDetailed multiSlotResponse = liveModel.RequestMultiSlotDecisionDetailed(eventId, contextJson, flags, baselineActions); MultiSlotResponseDetailedWrapper multiSlotResponseDetailedWrapper = multiSlotResponse == null ? null : new MultiSlotResponseDetailedWrapper(multiSlotResponse); return(multiSlotResponseDetailedWrapper); }
public Response <PersonalizerMultiSlotRankResult> Rank(PersonalizerRankMultiSlotOptions options) { string eventId = options.EventId; if (String.IsNullOrEmpty(eventId)) { eventId = Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture); } Dictionary <string, int> actionIdToActionIndex = RlObjectConverter.GetActionIdToIndexMapping(options.Actions); Dictionary <string, IList <object> > slotIdToFeatures = new Dictionary <string, IList <object> >(); foreach (var slot in options.Slots) { slotIdToFeatures.Add(slot.Id, RlObjectConverter.GetIncludedActionsForSlot(slot, actionIdToActionIndex)); } // Convert options to the compatible parameter for ChooseRank DecisionContext decisionContext = new DecisionContext(options, slotIdToFeatures); var contextJson = JsonSerializer.Serialize(decisionContext); ActionFlags flags = options.DeferActivation == true ? ActionFlags.Deferred : ActionFlags.Default; int[] baselineActions = RlObjectConverter.ExtractBaselineActionsFromRankRequest(options); // Call ChooseRank of local RL.Net MultiSlotResponseDetailedWrapper multiSlotResponseDetailedWrapper = liveModel.RequestMultiSlotDecisionDetailed(eventId, contextJson, flags, baselineActions); // Convert response to PersonalizerRankResult var value = RlObjectConverter.GenerateMultiSlotRankResponse(options.Actions, multiSlotResponseDetailedWrapper, eventId); return(Response.FromValue(value, default)); }
public static PersonalizerMultiSlotRankResult GenerateMultiSlotRankResponse(IList <PersonalizerRankableAction> actions, MultiSlotResponseDetailedWrapper multiSlotResponse, string eventId) { Dictionary <long, string> actionIndexToActionId = actions .Select((action, index) => new { action, index = (long)index }) .ToDictionary(obj => obj.index, obj => obj.action.Id); List <PersonalizerSlotResult> slots = multiSlotResponse .Select(slotRanking => new PersonalizerSlotResult(slotRanking.SlotId, actionIndexToActionId[slotRanking.ChosenAction])) .ToList(); return(new PersonalizerMultiSlotRankResult(slots, eventId)); }