def quantize_initializer(self, weight, qType, reduce_range=False, keep_float_weight=False):
            """
            :param weight: TensorProto initializer
            :param qType: type to quantize to
            :param keep_float_weight: Whether to quantize the weight. In some cases, we only want to
                                    qunatize scale and zero point. If keep_float_weight is False,
                                    quantize the weight, or don't quantize the weight.
            :return: quantized weight name, zero point name, scale name
            """
            # Find if this input is already quantized
            if weight.name in self.quantized_value_map:
                quantized_value = self.quantized_value_map[weight.name]
                return (
                    quantized_value.q_name,
                    quantized_value.zp_name,
                    quantized_value.scale_name,
                )

            q_weight_name = weight.name + TENSOR_NAME_QUANT_SUFFIX
            zp_name = weight.name + "_zero_point"
            scale_name = weight.name + "_scale"

            # Update packed weight, zero point, and scale initializers
            weight_data = tensor_proto_to_array(weight)
            _, _, zero_point, scale, q_weight_data = quantize_data_pof2s(
                weight_data.flatten(),
                qType,
                self.is_weight_symmetric,
                self.reduce_range and reduce_range,
                method=PowerOfTwoMethod.NonOverflow,
            )
            if is_ort_version_below_1_17():
                scale_qType = onnx_proto.TensorProto.FLOAT
                weight_qType = onnx.mapping.TENSOR_TYPE_TO_NP_TYPE[qType]
            else:
                scale_qType = onnx.helper.np_dtype_to_tensor_dtype(scale.dtype)
                weight_qType = onnx.helper.tensor_dtype_to_np_dtype(qType)

            scale_initializer = onnx.helper.make_tensor(scale_name, scale_qType, [], [float(scale)])
            zero_initializer = onnx.helper.make_tensor(zp_name, qType, [], [int(zero_point)])
            self.model.initializer().extend([scale_initializer, zero_initializer])
            if not keep_float_weight:
                q_weight_data = np.asarray(q_weight_data, dtype=weight_qType).reshape(weight.dims)
                q_weight_initializer = onnx.numpy_helper.from_array(q_weight_data, q_weight_name)
                self.model.initializer().extend([q_weight_initializer])

            # Log entry for this quantized weight
            quantized_value = QuantizedValue(
                weight.name,
                q_weight_name,
                scale_name,
                zp_name,
                QuantizedValueType.Initializer,
                None,
            )
            self.quantized_value_map[weight.name] = quantized_value

            return q_weight_name, zp_name, scale_name

            :param weight: TensorProto initializer
            :param qType: type to quantize to
            :param keep_float_weight: Whether to quantize the weight. In some cases, we only want to
                                    qunatize scale and zero point. If keep_float_weight is False,
                                    quantize the weight, or don't quantize the weight.
            :return: quantized weight name, zero point name, scale name
            
olive/passes/onnx/vitis_ai/quantizer.py